ZeroMQ выбирает получателя

Я новичок в 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 не предназначен для использования так, как я хочу. Так как я новичок в этом, любые советы очень ценятся!


person Brian Snow    schedule 16.05.2015    source источник


Ответы (1)


при использовании сокета Response вы всегда отвечаете клиенту, отправившему вам сообщение. Таким образом, типы сокетов Request-Response вместе представляют собой просто простой ответ на запрос.

Для более сложных сценариев вы, вероятно, захотите использовать Dealer-Router.

С маршрутизатором первый кадр каждого сообщения является идентификатором маршрутизации (идентификацией клиента, отправившего вам сообщение).

поэтому ваш пример с маршрутизатором будет выглядеть так:

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, возможно, оно ответит на большинство ваших вопросов.

person somdoron    schedule 17.05.2015
comment
Спасибо, это именно то, что я искал. Буду читать инструкцию! - person Brian Snow; 18.05.2015