最も一般的な使用パターンでList
は、接続されたクライアントを維持するだけで十分です。関心のある主なポイントは、決定することです:何のリスト?
多くのアプリケーションでは、純粋なTCP機能を使用するのは便利ではないため、ストリームをメッセージキューのようなものに変換し、そこから自己完結型の「メッセージ」全体を引き出すことができるレイヤーがその上に必要になります。これらのメッセージの形式は、アプリケーションによって異なります。
私は、複数のクライアントがサーバーに接続してリモート制御機能を提供するクライアントサーバー構成である私の古いプロジェクトを掘り起こしました。そのプロジェクトでは、サーバーは次のList<ConnectedClient>
場所を保持します。
// This is the whole actual class
private class ConnectedClient
{
public TcpMessageConnection Connection { get; private set; }
public bool ConnectedEventRaised { get; set; }
public ConnectedClient(TcpMessageConnection connection)
{
this.Connection = connection;
}
}
そしてTcpMessageConnection
次のようになります:
// Only class outline shown
public class TcpMessageConnection
{
private readonly MessageStream messageStream; // another custom class
private readonly TcpClient tcpClient;
public EndPoint RemoteEndPoint { get; private set; } // who connected here?
public MessageReader MessageReader { get; } // messageStream.Reader
public MessageWriter MessageWriter { get; } // messageStream.Writer
public bool IsCurrentlyDisconnecting { get; private set; }
public void Close();
}
MessageReader
およびMessageWriter
(これは非常に手間のかかる作業です)と一緒に、これは単一のスレッドで複数のクライアントにサービスを提供する非同期ベースのサーバーを実装するのに十分です。