繁体   English   中英

谁能告诉我这个ZeroMQ代码有什么问题吗?

[英]Can anyone tell me what is wrong with this ZeroMQ code?

我尝试了各种不同的方法,但这实际上是我要尝试的方法。 设置了正在处理的pubsub。 我重新运行了此代码,但在尝试将pub套接字连接到转发器设备的前端时遇到连接被拒绝的情况。

这是代码

string expectedAddress = "XXXX";
        string message = "hello its me";
        int count = 0;
        using (var context = ZmqContext.Create())
        {
            using (var forwarderDevice = new ForwarderDevice(context, "inproc://front", "inproc://back", DeviceMode.Threaded))
            {
                using (var pub = Helper.GetConnectedPublishSocket(context, "inproc://front"))
                {
                    using (var sub = Helper.GetConnectedSubscribeSocket(context, "inproc://back")) 
                    {
                        forwarderDevice.Start();

                        Helper.SendOneSimpleMessage(expectedAddress, message, pub);

                        var zmqMessage = Helper.ReceiveMessage(sub);

                        Assert.AreEqual(count, zmqMessage.FrameCount);
                        Frame frame = zmqMessage[0];
                        var address = Encoding.Unicode.GetString(frame.Buffer);
                        Assert.AreEqual(expectedAddress, address);
                    }
                }
                forwarderDevice.Stop();
            }
        }

好,第一件事,我知道我做错了...开始应在创建设备后立即进行,然后再尝试连接它。 第二件事是设备在另一个线程上启动,并且在主线程尝试连接时可能尚未就绪,因此您需要阻止一些方法,直到就绪为止。 现在的代码如下所示:

string expectedAddress = "XXXX";
        string message = "hello its me";
        int count = 0;
        using (var context = ZmqContext.Create())
        {
            using (var forwarderDevice = new ForwarderDevice(context, "inproc://front", "inproc://back", DeviceMode.Threaded))
            {
                forwarderDevice.Start();
                while (!forwarderDevice.IsRunning)
                { }

                using (var pub = Helper.GetConnectedPublishSocket(context, "inproc://front"))
                {
                    using (var sub = Helper.GetConnectedSubscribeSocket(context, "inproc://back")) 
                    {
                        Task<ZmqMessage> task = Task.Run(() =>
                            {
                                var zmqMessage = Helper.ReceiveMessage(sub);
                                return zmqMessage;
                            });

                        Helper.SendOneSimpleMessage(expectedAddress, message, pub);
                        task.Wait();

                        var result = task.Result;

                        Assert.AreEqual(count, result.FrameCount);
                        Frame frame = result[0];
                        var address = Encoding.Unicode.GetString(frame.Buffer);
                        Assert.AreEqual(expectedAddress, address);
                    }
                }
                forwarderDevice.Stop();
            }
        }

我没有收到任何错误,但我也从未收到此消息

仅查看代码的后半部分,经典的SUB错误是实际上并未订阅任何内容-您需要将ockopt的SUBSCRIBE设置为“”(空字符串)以获取所有消息。 因此,如果这是一个PUB / SUB套接字对,除非您正在订阅帮助程序,否则它将仅过滤消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM