私はクライアント/サーバーインフラストラクチャを持っています。現在、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のクライアントがあり、同時にすべてのデータをサーバーに送信したい場合は、すべてのサーバーが失敗しますが、1つのクライアントの接続が遅く、ソケットが不安定な場合は、他のすべての通信が停止します。
同時にすべてのクライアントからデータを受信し、受信したデータをキューに追加してダウンロードが完了したら処理する方法はありませんか?
恥知らずのプラグイン:http://jonathan.dickinsons.co.za/blog/2011/02/net-sockets-and-you/ - 非同期ループを短く触れます。実際の実装が含まれています(@Jalalのように 'ThreadPool'を使うべきではありません)。 –