我有一個客戶端/服務器基礎結構。目前他們使用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')。 –