0

私は現在、クライアント/サーバーについて学習して作業していますが、接続を保存する方法についていくつか問題があります。

サンプルコードは次のとおりです。

while (_isRunning)
{
    if (!tcpListener.Pending())
    {
        Thread.Sleep(200);
        continue;
    }

    TcpClient client = tcpListener.AcceptTcpClient();
    // TODO: handle connection
}

特定のクライアントにデータを送受信するハンドラーがあることはわかっていますが、ハンドラーがあるだけでは、接続されているクライアントの数を確認したり、ブロードキャストメッセージやシャットダウンメッセージをすべてのクライアントに送信したりすることはできません。

クライアントをリストに保存しても問題ありませんか、それとも他のものを保存する必要がありますか?

この場合、接続されているクライアントを保存する正しい方法は何でしょうか?

4

2 に答える 2

1

最も一般的な使用パターンで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(これは非常に手間のかかる作業です)と一緒に、これは単一のスレッドで複数のクライアントにサービスを提供する非同期ベースのサーバーを実装するのに十分です。

于 2012-09-27T23:14:23.057 に答える
0

サーバーの場合、通常、ソケットの目的ほどソケットには関心がありません。私が採用するアプローチは、クライアントとサーバー間の会話のサーバー側を管理するクラスを持つことです。このクラスはスレッドに基づいているため、接続が受け入れられるたびに、スレッドをスピンオフして会話を処理し、そのスレッドで接続のサーバー側のソケットになるという考え方です。

この時点で、個々のソケットではなく、さまざまなスレッドを管理することになります。これは、より高いレベルの抽象化であり、より便利です。

スレッドをどのように管理するかは、何をしたいかによって異なります。本当に心配したくないのかもしれません。各スレッドは独自の処理を実行するため、実行されると、TCP接続の終了を閉じて終了します。

ただし、終了するまで、スレッドクラスは会話のサーバー側を処理します。

このstackoverflow、複数のtcpクライアントを受け入れるための最良の方法を確認することをお勧めします。

于 2012-09-27T17:56:38.557 に答える