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

时间:2018-04-13 06:13:16

标签: c# tcp parallel-processing sendfile

如何在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);
        }

1 个答案:

答案 0 :(得分:1)

TCPClient和TCPListener都在内部使用套接字,只是提供更高级别的抽象。换句话说,你仍在使用套接字,而不是直接使用套接字。

为了并行发送多个文件,您需要服务器能够接受多个连接。有几种方法可以实现这一点,但总体思路是一样的:

  • 启动你的听众
  • 任何客户端连接时,请勿在处理该客户端时阻止,而是在可用时立即尝试连接下一个客户端连接
  • 对于每个连接的客户端,处理连接以接收文件数据并执行您需要做的任何事情

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

在客户端上,您可以启动一些TCPClient对象,每个对象用于您要发送的每个文件,并将数据发送给您的侦听器。

您必须弄清楚数据传输的后勤(协议)。当您获得在侦听器端接收的每个文件的传入数据传输时,您必须确定每个文件代表什么以及它来自何处。这里的细节非常主观,并不适合StackOverflow Q&amp; A。