使用c#和python进行NetMQ扩展请求 - 回复

时间:2016-08-16 21:39:07

标签: c# python asp.net message-queue netmq

我可以使用简单的请求 - 回复让c#(客户端)和python(服务器)相互通信。但是,我希望我在c#asp.net上构建的web应用程序稳定并需要更多的客户端和服务器,所以我尝试使用扩展REQ-REP连接来连接c#和python。

但是,当我运行下面的代码时,它不会作为代理执行任务并且不输出任何内容。我在这里做错了什么?

5600 = c#client

5601 = python服务器

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();
                            }
                        }

1 个答案:

答案 0 :(得分:0)

您没有使用正确的标志发送所有消息帧。

您可以尝试使用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();        
}