在 c# 中使用客户端和服务器之间的 tcp 连接并行发送多个文件

send multiple files parallely using tcp connection between client and server in c#

我如何使用 C# 在客户端和服务器之间并行发送多个文件。我已经尝试发送单个文件,代码如下。

另外请解释不使用套接字发送文件(如下所示)与使用套接字发送文件之间的区别

服务器端

TcpListener filelistener = new TcpListener(IPAddress.Parse(GetIP()), 8085);
            MessageBox.Show("server started");
             filelistener.Start();
            TcpClient client = filelistener.AcceptTcpClient();
            Message("Client connection accepted from :" + client.Client.RemoteEndPoint + ".");

             byte[] buffer = new byte[1500];
            int bytesread = 1;


            StreamWriter writer = new StreamWriter("C:\Users\ab\Desktop\abc.txt");

            while (bytesread > 0)
            {
                bytesread = client.GetStream().Read(buffer, 0, buffer.Length);
                if (bytesread == 0)
                    break;
                writer.BaseStream.Write(buffer, 0, buffer.Length);
                Message(bytesread + " Received. ");
                  }
                writer.Close();

客户端

 try
        {
            StreamReader sr = new StreamReader(textBox1.Text);
            TcpClient tcpClient = new TcpClient();
            tcpClient.Connect(new IPEndPoint(IPAddress.Parse(GetIP()), 8085));


            byte[] buffer = new byte[1500];
            long bytesSent = 0;

            while (bytesSent < sr.BaseStream.Length)
            {
                int bytesRead = sr.BaseStream.Read(buffer, 0, 1500);
                tcpClient.GetStream().Write(buffer, 0, bytesRead);
                Message(bytesRead + " bytes sent.");

                bytesSent += bytesRead;
            }

            tcpClient.Close();

            MessageBox.Show("finished");
            Console.ReadLine();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }

TCPClient 和 TCPListener 都在内部使用套接字,只是提供更高层次的抽象。换句话说,你仍在使用套接字,只是没有直接使用。

为了并行发送多个文件,您需要服务器能够接受多个连接。有几种方法可以完成此操作,但总体思路是相同的:

  • 启动您的侦听器
  • 一旦有任何客户端连接,在处理该客户端时不要阻塞,而是尝试在下一个客户端连接可用时立即连接
  • 对于每个连接的客户端,处理连接以接收文件数据并做任何你需要做的事情

参见:https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclientasync(v=vs.110).aspx

在客户端,您可以启动多个 TCPClient 对象,每个对象对应您要发送的每个文件,并将数据发送到您的侦听器。

您必须弄清楚数据传输的物流(协议)。当您为在侦听器端接收的每个文件获取传入数据传输时,您必须决定每个文件代表什么以及它来自谁。此处的详细信息非常主观,不太适合 Whosebug 问答。