在 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 都在内部使用套接字,只是提供更高层次的抽象。换句话说,你仍在使用套接字,只是没有直接使用。
为了并行发送多个文件,您需要服务器能够接受多个连接。有几种方法可以完成此操作,但总体思路是相同的:
- 启动您的侦听器
- 一旦有任何客户端连接,在处理该客户端时不要阻塞,而是尝试在下一个客户端连接可用时立即连接
- 对于每个连接的客户端,处理连接以接收文件数据并做任何你需要做的事情
在客户端,您可以启动多个 TCPClient 对象,每个对象对应您要发送的每个文件,并将数据发送到您的侦听器。
您必须弄清楚数据传输的物流(协议)。当您为在侦听器端接收的每个文件获取传入数据传输时,您必须决定每个文件代表什么以及它来自谁。此处的详细信息非常主观,不太适合 Whosebug 问答。
我如何使用 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 都在内部使用套接字,只是提供更高层次的抽象。换句话说,你仍在使用套接字,只是没有直接使用。
为了并行发送多个文件,您需要服务器能够接受多个连接。有几种方法可以完成此操作,但总体思路是相同的:
- 启动您的侦听器
- 一旦有任何客户端连接,在处理该客户端时不要阻塞,而是尝试在下一个客户端连接可用时立即连接
- 对于每个连接的客户端,处理连接以接收文件数据并做任何你需要做的事情
在客户端,您可以启动多个 TCPClient 对象,每个对象对应您要发送的每个文件,并将数据发送到您的侦听器。
您必须弄清楚数据传输的物流(协议)。当您为在侦听器端接收的每个文件获取传入数据传输时,您必须决定每个文件代表什么以及它来自谁。此处的详细信息非常主观,不太适合 Whosebug 问答。