我有一个客户端/服务器基础结构。目前他们使用TcpClient和TcpListener在所有客户端和服务器之间发送接收数据。接受多个tcp客户端的最佳方式是什么?
我目前所做的是在接收到数据(在它自己的线程上)时,将它放入另一个要处理的线程的队列中,以便释放套接字以准备好并打开以接收新数据。
// Enter the listening loop.
while (true)
{
Debug.WriteLine("Waiting for a connection... ");
// Perform a blocking call to accept requests.
using (client = server.AcceptTcpClient())
{
data = new List<byte>();
// Get a stream object for reading and writing
using (NetworkStream stream = client.GetStream())
{
// Loop to receive all the data sent by the client.
int length;
while ((length = stream.Read(bytes, 0, bytes.Length)) != 0)
{
var copy = new byte[length];
Array.Copy(bytes, 0, copy, 0, length);
data.AddRange(copy);
}
}
}
receivedQueue.Add(data);
}
但是我想知道是否有更好的方法来做到这一点。例如,如果有10个客户端,并且他们都希望同时向服务器发送数据,则其他客户端将会通过,而其他客户端则会失败。或者,如果一个客户端的连接速度较慢并且占用套接字,则所有其他通信都将停止。
不是有一些方法能够同时接收来自所有客户端的数据,并在队列中等待处理时,它已经完成下载添加接收到的数据?
无耻的插件:http://jonathan.dickinsons.co.za/blog/2011/02/net-sockets-and-you/ - 短暂涉及异步循环;并包含一个真正的实现(你不应该像使用@Jalal建议的那样使用'ThreadPool')。 –