Обмен сообщениями между клиентами NetMQ

#zeromq #netmq

#zeromq #netmq

Вопрос:

Я пытаюсь создать программу rpc для обмена хостами, расположенными в разных сетях, и выбрал конфигурацию NetMQ для маршрутизатора-дилера, представленную здесь:http://netmq.readthedocs.io/en/latest/router-dealer/#router-dealer

Но проблема в том, что маршрутизатор всегда выбирает случайного дилера при маршрутизации сообщения на серверную часть. Код, который я использовал :

 using (var frontend = new RouterSocket(string.Format("@tcp://{0}:{1}", "127.0.0.1", "5556")))//"@tcp://10.0.2.218:5559"
                using (var backend = new DealerSocket(string.Format("@tcp://{0}:{1}", "127.0.0.1", "5557")))//"@tcp://10.0.2.218:5560"
                {
                    // Handler for messages coming in to the frontend
                    frontend.ReceiveReady  = (s, e) =>
                    {
                        Console.WriteLine("message arrived on frontEnd");                            
                        NetMQMessage msg = e.Socket.ReceiveMultipartMessage();
                        string clientAddress = msg[0].ConvertToString();                            
                        Console.WriteLine("Sending to :"   clientAddress);
                        //TODO: Make routing here
                        backend.SendMultipartMessage(msg); // Relay this message to the backend                        };

                    // Handler for messages coming in to the backend
                    backend.ReceiveReady  = (s, e) =>
                    {
                        Console.WriteLine("message arrived on backend");
                        var msg = e.Socket.ReceiveMultipartMessage();

                        frontend.SendMultipartMessage(msg); // Relay this message to the frontend
                    };

                    using (var poller = new NetMQPoller { backend, frontend })
                    {
                        // Listen out for events on both sockets and raise events when messages come in
                        poller.Run();
                    }
                }
  

Код для клиента:

 using (var client = new RequestSocket(">tcp://"   "127.0.0.1"   ":5556"))
        {
            var messageBytes = UTF8Encoding.UTF8.GetBytes("Hello");
            var messageToServer = new NetMQMessage();
            //messageToServer.AppendEmptyFrame();
            messageToServer.Append("Server2");
            messageToServer.Append(messageBytes);
            WriteToConsoleVoid("======================================");
            WriteToConsoleVoid(" OUTGOING MESSAGE TO SERVER ");
            WriteToConsoleVoid("======================================");
            //PrintFrames("Client Sending", messageToServer);
            client.SendMultipartMessage(messageToServer);

            NetMQMessage serverMessage = client.ReceiveMultipartMessage();
            WriteToConsoleVoid("======================================");
            WriteToConsoleVoid(" INCOMING MESSAGE FROM SERVER");
            WriteToConsoleVoid("======================================");
            //PrintFrames("Server receiving", clientMessage);
            byte[] rpcByteArray = null;
            if (serverMessage.FrameCount == 3)
            {
                var clientAddress = serverMessage[0];
                rpcByteArray = serverMessage[2].ToByteArray();
            }

            WriteToConsoleVoid("======================================");
            Console.ReadLine();
        }
  

Код для дилера:

 using (var server = new ResponseSocket())
        {
            server.Options.Identity = UTF8Encoding.UTF8.GetBytes(confItem.ResponseServerID);
            Console.WriteLine("Server ID:"   confItem.ResponseServerID);
            server.Connect(string.Format("tcp://{0}:{1}", "127.0.0.1", "5557"));
            using (var poller = new NetMQPoller { server })
            {
                server.ReceiveReady  = (s, a) =>
                    {
                        byte[] response = null;
                        NetMQMessage serverMessage = null;
                        try
                        {
                            serverMessage = a.Socket.ReceiveMultipartMessage();
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine("Exception on ReceiveMultipartMessage : "   ex.ToString());
                            //continue;
                        }
                        byte[] eaBody = null;
                        string clientAddress = "";
                        if (serverMessage.FrameCount == 2)
                        {
                            clientAddress = serverMessage[0].ConvertToString();
                            Console.WriteLine("ClientAddress:"   clientAddress);
                            eaBody = serverMessage[1].ToByteArray();
                            Console.WriteLine("Received message from remote computer: {0} bytes , CurrentID : {1}", eaBody.Length, confItem.ResponseServerID);
                        }
                        else
                        {
                            Console.WriteLine("Received message from remote computer: CurrentID : {0}", confItem.ResponseServerID);
                        }
                    };
                poller.Run();
            }
        }
  

Возможно ли выбрать конкретный серверный интерфейс во внешнем интерфейсе.Прием готов?
Спасибо!

Комментарии:

1. Можете ли вы также включить рабочий код?

2. Привет. Я включил коды клиента и дилера по вашему запросу. Заранее спасибо. Жду вашего ответа.

Ответ №1:

Ваш серверный сервер также должен быть маршрутизатором. Вам нужно, чтобы работник зарегистрировался, или вам нужно знать всех доступных работников и их личность. При отправке на серверную часть введите идентификатор рабочего в начале сервера.

Взгляните на пример Majordomo в руководстве по zeromq:

http://zguide.zeromq.org/page:all#toc72
http://zguide.zeromq.org/page:all#toc98

Комментарии:

1. Спасибо. Попробую