当前位置:首页 » 文件管理 » socket上传文件

socket上传文件

发布时间: 2025-07-03 03:57:24

java socket如何实现一次传送多个文件

很简单,就是把多个文件“变成”一个文件传送就可以了,每个文件都是一个流,把这些流输入到一个流中合并流传输即可,这个是基本思路。实现差不多以下两个方法
1、直接流拼接,循环要传输的文件列表,多个InputStream,然后输出到一个OutputStream,这个out就是发送数据的端口,为了接收端能够识别每个文件从而分割流,需要每个流中结尾添加分隔符。其实这就是HTTP文件上传的做法。
2、就比较简单了,职业使用ZIP工具包吧需要传输的多文件压缩成一个文件传输,接收端直接解压缩就完事。
需要注意的是,发送多文件上传你需要提取计算好总传输量字节大小放在传输报文头部告诉接收端你要发送的数据有多大,不然接收端可能无法完整接收数据。

Ⅱ c# c/s结构Socket上传文件的代码

  1. 发送端(client)

  2. private void button2_Click(object sender, EventArgs e)
    {

    this.button2.Enabled = false;
    Thread TempThread = new Thread(new ThreadStart(this.StartSend));
    TempThread.Start();

    }

    private void StartSend()
    {
    //FileInfo EzoneFile = new FileInfo(this.textBox1.Text);

    string path = @"E:old F directoryTangWeikangge ew1.jpg";

    FileInfo EzoneFile = new FileInfo(path);

    FileStream EzoneStream = EzoneFile.OpenRead();

    int PacketSize = 100000;

    int PacketCount = (int)(EzoneStream.Length / ((long)PacketSize));

    // this.textBox8.Text = PacketCount.ToString();

    // this.progressBar1.Maximum = PacketCount;

    int LastDataPacket = (int)(EzoneStream.Length - ((long)(PacketSize * PacketCount)));

    // this.textBox9.Text = LastDataPacket.ToString();
    IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("163.180.117.229"), 7000);

    Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    client.Connect(ipep);

    // TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(EzoneFile.Name));

    // TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketSize.ToString()));

    // TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(PacketCount.ToString()));

    // TransferFiles.SendVarData(client, System.Text.Encoding.Unicode.GetBytes(LastDataPacket.ToString()));

    byte[] data = new byte[PacketSize];

    for(int i=0; i<PacketCount; i++)
    {
    EzoneStream.Read(data, 0, data.Length);

    TransferFiles.SendVarData(client, data);

    // this.textBox10.Text = ((int)(i + 1)).ToString();

    // this.progressBar1.PerformStep();
    }

    if(LastDataPacket != 0)
    {
    data = new byte[LastDataPacket];

    EzoneStream.Read(data, 0, data.Length);

    TransferFiles.SendVarData(client,data);

    // this.progressBar1.Value = this.progressBar1.Maximum;
    }
    client.Close();

    EzoneStream.Close();

    this.button2.Enabled = true;
    }

  3. 接收端(server)

  4. private void button2_Click(object sender, EventArgs e)
    {
    //int i = 0;
    //FileStream recfs = new FileStream("E:\kangge.jpg", FileMode.OpenOrCreate);
    //Byte[] recbyte = new Byte[2000000];
    //Socket hostsocket = receive.Accept();
    //BinaryWriter newfilestr = new BinaryWriter(recfs);
    //hostsocket.Receive(recbyte, recbyte.Length, SocketFlags.None);
    //for (i = 0; i < recbyte.Length; i++)
    //{
    // newfilestr.Write(recbyte, i, 1);
    //}
    //recfs.Close();

    //hostsocket.Shutdown(SocketShutdown.Receive);
    //hostsocket.Close();

    this.button2.Enabled = false;
    Thread TempThread = new Thread(new ThreadStart(this.StartReceive));
    TempThread.Start();

    }
    private void StartReceive()
    {
    IPEndPoint ipep = new IPEndPoint(IPAddress.Parse("163.180.117.229"), 7000);

    Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    server.Bind(ipep);

    server.Listen(10);

    Socket client = server.Accept();

    // IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;

    // string SendFileName = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));

    // string BagSize = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));

    // int bagCount = int.Parse(System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client)));

    // string bagLast = System.Text.Encoding.Unicode.GetString(TransferFiles.ReceiveVarData(client));
    int file_name = 1;

    string fileaddr = "E:\old F directory\TangWei\Copy of kangge\" + file_name.ToString() + ".jpg";

    FileStream MyFileStream = new FileStream(fileaddr, FileMode.Create, FileAccess.Write);

    // int SendedCount = 0;

    while(true)
    {
    byte[] data = TransferFiles.ReceiveVarData(client);
    if(data.Length == 0)
    {
    break;
    }
    else
    {
    // SendedCount++;
    MyFileStream.Write(data, 0, data.Length);
    }
    }

    MyFileStream.Close();

    client.Close();

    this.button2.Enabled = true;
    }

  5. 公共类。 TransferFiles

  6. class TransferFiles
    {

    public TransferFiles()
    {

    }

    public static int SendVarData(Socket s, byte[] data) // return integer indicate how many data sent.
    {
    int total = 0;
    int size = data.Length;
    int dataleft = size;
    int sent;
    byte[] datasize = new byte[4];
    datasize = BitConverter.GetBytes(size);
    sent = s.Send(datasize);//send the size of data array.

    while (total < size)
    {
    sent = s.Send(data, total, dataleft, SocketFlags.None);
    total += sent;
    dataleft -= sent;
    }

    return total;
    }

    public static byte[] ReceiveVarData(Socket s) // return array that store the received data.
    {
    int total = 0;
    int recv;
    byte[] datasize = new byte[4];
    recv = s.Receive(datasize, 0, 4, SocketFlags.None);//receive the size of data array for initialize a array.
    int size = BitConverter.ToInt32(datasize, 0);
    int dataleft = size;
    byte[] data = new byte[size];

    while (total < size)
    {
    recv = s.Receive(data, total, dataleft, SocketFlags.None);
    if (recv == 0)
    {
    data = null;
    break;
    }
    total += recv;
    dataleft -= recv;
    }

    return data;

    }
    }

Ⅲ qtcpsocket传输文件,文件换行符丢失

1、首先,读取待传输的文件内容,将’ ’和’ ’都转换为’ ’的形式。
2、其次,在接收端,接收数据后也要先将’ ’转换为’ ’。
3、最后,在处理接收到的文件时,将’ ’转换为操作系统所使用的换行符。

Ⅳ iOS 中设备之间 socket 传文件应该怎么实现

socket是比较底层的通讯方式,只是建立了一个连接通道,具体上面传输什么样的数据,按照什么格式传输,需要你自己定义。换句话说,你需要自己定义一个文件传输协议。例如,要定义数据包的大小,要定义每个数据包的格式,定义纠错机制,网络中断后如何恢复等等。大文件要拆分成数据包来传输,接收方要把收到的数据包再组装起来。文件名这些信息也做为原始数据的一部分通过数据包传过去,只不过跟文件内容的数据包类型不一样而已。
但是,实现这样一个传输协议是比较麻烦和容易出错的,象传文件这种逻辑比较简单的操作一般没必要在socket层直接操作。iOS提供了CFStream接口,适合文件这种数据流的传输。iOS本身的FTP和HTTP协议栈的实现也是使用CFStream API,而不是直接操作socket的。

热点内容
python文件路径变量 发布:2025-07-03 23:05:04 浏览:747
苹果手机怎么删掉safari以存储的密码 发布:2025-07-03 22:56:51 浏览:255
数量存储 发布:2025-07-03 22:56:44 浏览:282
魔兽地图破解加密 发布:2025-07-03 22:42:48 浏览:250
java中的默认值 发布:2025-07-03 22:11:34 浏览:753
岳姓三才配置怎么分 发布:2025-07-03 22:10:26 浏览:670
算法需求分析 发布:2025-07-03 22:00:45 浏览:148
单片机的交叉编译 发布:2025-07-03 22:00:45 浏览:864
鼠标存储 发布:2025-07-03 21:43:54 浏览:104
unity3d脚本打包 发布:2025-07-03 21:36:05 浏览:865