0

私は ZeroMQ (およびネットワーク全般) に不慣れで、複数のクライアントが単一のサーバーに接続するセットアップで ZeroMQ を使用することについて質問があります。私の状況は次のとおりです。

--1 サーバー
--複数のクライアント

-- クライアントがサーバーにメッセージを送信する: この部分の実行方法は既に把握しています。
-- サーバーが特定のクライアントにメッセージを送信する: これは私が問題を抱えている部分です。特定のイベントがサーバーで処理されると、サーバーはすべてのクライアントではなく、特定のクライアントにメッセージを送信する必要があります。つまり、サーバーは、特定のメッセージを送信するクライアントを選択できる必要があります。

現在、これは私のサーバーコードです:

using (NetMQContext ctx = NetMQContext.Create())
{
    using (var server = ctx.CreateResponseSocket())
    {
        server.Bind(@"tcp://127.0.0.1:5555");
        while (true)
        {
            string fromClientMessage = server.ReceiveString();
            Console.WriteLine("From Client: {0}", fromClientMessage);

            server.Send("ack"); // There is no overload for the 'Send'
                                   method that takes an IP address as an argument!
        }
    }
}

問題は私のデザインが間違っていることであり、ResponseSocketタイプが私が使いたい方法で使用されることを意図していないことにあると感じています。初心者なのでアドバイスいただけると助かります!

4

1 に答える 1

1

Response ソケットを使用する場合、メッセージを送信したクライアントに常に返信します。したがって、Request-Response ソケット タイプを合わせたものは、単純な要求応答です。

より複雑なシナリオでは、Dealer-Router を使用することをお勧めします。

ルーターでは、各メッセージの最初のフレームはルーティング ID (メッセージを送信したクライアントの ID) です。

したがって、ルーターを使用した例は次のようになります。

using (NetMQContext ctx = NetMQContext.Create())
{
    using (var server = ctx.CreateRouterSocket())
    {
        server.Bind(@"tcp://127.0.0.1:5555");
        while (true)
        {
            byte[] routingId = server.Receive();
            string fromClientMessage = server.ReceiveString();
            Console.WriteLine("From Client: {0}", fromClientMessage);

            server.SendMore(routingId).Send("ack");
        }
    }
}

zeromq guideも読むことをお勧めします。おそらくほとんどの質問に答えてくれるでしょう。

于 2015-05-17T13:31:05.237 に答える