我有一个客户端/服务器基础架构。目前,他们使用TcpClient和TcpListener在所有客户端和服务器之间发送和接收数据。
当前的做法是,当数据被接收(在它自己的线程上),它会被放入队列中以供另一个线程处理,以便释放套接字,使其准备好并且可以接收新数据。
然而,我想找出是否有更好的方法来解决这个问题。例如,如果有10个客户端都想同时向服务器发送数据,则只有一个会成功,而其他所有客户端都会失败。或者,如果一个客户端连接速度慢并且占用了套接字,所有其他通信都将停止。
难道没有一种方式可以同时从所有客户端接收数据,并在其完成下载后将接收到的数据添加到队列中进行处理吗?
当前的做法是,当数据被接收(在它自己的线程上),它会被放入队列中以供另一个线程处理,以便释放套接字,使其准备好并且可以接收新数据。
// 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个客户端都想同时向服务器发送数据,则只有一个会成功,而其他所有客户端都会失败。或者,如果一个客户端连接速度慢并且占用了套接字,所有其他通信都将停止。
难道没有一种方式可以同时从所有客户端接收数据,并在其完成下载后将接收到的数据添加到队列中进行处理吗?
ThreadPool
)。 - Jonathan Dickinson