Расширенный запрос-ответ NetMQ с использованием С# и Python

Я могу заставить С# (клиент) и python (сервер) общаться друг с другом, используя простой запрос-ответ. Однако я хочу, чтобы мое веб-приложение, построенное на c# asp.net, было стабильным и нуждалось в большем количестве клиентов и серверов, поэтому я попытался подключить c# и python с помощью расширенного соединения REQ-REP.

Но когда я запускаю приведенный ниже код, он не выполняет свою работу в качестве брокера и ничего не выводит. Что я здесь делаю неправильно?

5600 = клиент С#

5601 = сервер питона

using (var frontend = new RouterSocket("@tcp://127.0.0.1:5600"))
                        using (var backend = new DealerSocket("@tcp://127.0.0.1:5601"))
                        {
                            // Handler for messages coming in to the frontend
                            frontend.ReceiveReady += (s, p) =>
                            {
                                var msg = p.Socket.ReceiveFrameString();
                                backend.SendFrame(msg); // Relay this message to the backend
                            };

                            // Handler for messages coming in to the backend
                            backend.ReceiveReady += (s, p) =>
                            {
                                var msg = p.Socket.ReceiveFrameString();
                                frontend.SendFrame(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();
                            }
                        }

person Oleole    schedule 16.08.2016    source источник


Ответы (1)


Вы не отправляете все кадры сообщений с правильными флагами.

Вы можете попробовать пользовательский прокси-сервер netmq, который делает именно это. Если вы все еще хотите написать это вручную, посмотрите, как прокси делает это с правильными флагами кадров здесь:

https://github.com/zeromq/netmq/blob/master/src/NetMQ/Proxy.cs

Обновлять:

Ниже приведен пример использования прокси в вашем случае:

using (var frontend = new RouterSocket("@tcp://127.0.0.1:5600"))
using (var backend = new DealerSocket("@tcp://127.0.0.1:5601"))
{
    using (var poller = new NetMQPoller { backend, frontend })
    {
        var proxy = new Proxy(frontend, backend, null, poller);
        proxy.Start();
        proxy.Run();
    }
}

Вы также можете использовать его без поллера:

using (var frontend = new RouterSocket("@tcp://127.0.0.1:5600"))
using (var backend = new DealerSocket("@tcp://127.0.0.1:5601"))
{       
    var proxy = new Proxy(frontend, backend);
    proxy.Start();        
}
person somdoron    schedule 17.08.2016
comment
В ссылке, которой вы поделились, кажется, что я могу просто добавить прокси-сервер netmq после сокета захвата Router-Dealer, поскольку в коде нет места, указывающего передний и задний порты. - person Oleole; 17.08.2016
comment
Я не уверен, что понял ваш комментарий, в любом случае я добавил пример кода, это помогает? - person somdoron; 18.08.2016
comment
Вместо этого я решил запустить прокси на python. Тем не менее, большое спасибо за помощь :) - person Oleole; 19.08.2016