1

非同期オブジェクト送信にアプローチする最良の方法を見つけようとしています。

私がやりたいことは、1 つのサーバーに接続するネットワーク接続 (5 ~ 10 クライアント) で同じアプリケーションの複数のインスタンスを開き、アプリケーションの 1 つがそのデータを更新するときに、その更新を他のすべてのアプリケーションに送信する必要があることです。インスタンス。

更新オブジェクトは次のようになります。

public class UpdateData
{
    public double Angle { get; set; }
    public double Azimuth { get; set; }
    public Point Position { get; set; }
    public Guid ObjectGuid { get; set; }
}

データはそれほど大きくはありませんが、このタイプのオブジェクトは、各クライアントから他のすべてのクライアントに毎秒約 10 ~ 50 回送信されます。

この種のデータ転送を処理する最善の方法は何ですか?

私が考えていたのは、サーバーオブジェクトに次のようなものを使用して接続をリッスンさせ、受け入れることです:

    private void BtConnectClick(object sender, EventArgs e)
    {
        int port;

        if (!int.TryParse(tbPort.Text, out port))
        {
            MessageBox.Show("Please enter a valid port into the textbox");
            tbPort.Text = "";
            return;
        }

        try
        {
            _listener = new TcpListener(IPAddress.Any, port);
            _listener.Start();

            _listener.BeginAcceptSocket(OnClientConnect, _listener);

        }
        catch (SocketException se)
        {
            MessageBox.Show(se.Message);
        }

    }

    public void OnClientConnect(IAsyncResult asyn)
    {
        try
        {
            var s = _listener.EndAcceptSocket(asyn);

            _clients.Add(s);  // List<Socket> object
        }
        catch (SocketException se)
        {
            MessageBox.Show(se.Message);
        }
    }

しかし、サーバーはデータ転送をどのように処理する必要があるのでしょうか?

のすべてのソケットからデータを受信しようとする必要があることはわかっています。データ_clientsを受信したら、データを の他のすべてのソケットに転送する必要があります_clinetsが、どうすればよいですか? クライアントが接続を終了したことをどこでどのように検出すればよいですか?

また、クライアントは、サーバーにデータを送信するだけでなく、サーバーから受信するデータをリッスンする必要があります。そのすべてを 1 つのソケットで処理できますか、それとも 2 つ使用する必要がありますか?

助けてくれてありがとう!

4

1 に答える 1

1

個人的には、これをメッセージ バス/サービス バス、または pub/sub を使用する他のものに任せます。私の好みは redis です: http://redis.io/commands#pubsub

オブジェクトに関しては、protobuf-net を使用します。単純に、上記のメッセージに対して小さなバイナリが生成されることがわかっているからです。BLOB を名前付き redis チャネルに送信 (PUBLISH) すると、そのチャネルのすべてのリスナーに配布されます。

于 2011-03-29T17:07:14.540 に答える