C# 无法使用NetMQ 4.x使ReadyReceive发布订阅正常工作

C# 无法使用NetMQ 4.x使ReadyReceive发布订阅正常工作,c#,netmq,C#,Netmq,我创建了2个简单的C#Console项目(.net 4.5.2),向每个项目添加了v4.0.0.1 NetMQ Nuget包,将每个程序加载到单独的Visual Studio 2017社区版中,在OnReceiveReady回调方法中包含的1行上放置一个断点,首先启动订阅程序,然后启动发布程序。订阅服务器中未触发ReceiveReady事件。我做错了什么?即使我选择subSocket.Subscribe(“”),我仍然没有收到任何消息。此外,删除/修改发送/接收高水位线也不会改变情况。谢谢你的帮

我创建了2个简单的C#Console项目(.net 4.5.2),向每个项目添加了v4.0.0.1 NetMQ Nuget包,将每个程序加载到单独的Visual Studio 2017社区版中,在OnReceiveReady回调方法中包含的1行上放置一个断点,首先启动订阅程序,然后启动发布程序。订阅服务器中未触发ReceiveReady事件。我做错了什么?即使我选择subSocket.Subscribe(“”),我仍然没有收到任何消息。此外,删除/修改发送/接收高水位线也不会改变情况。谢谢你的帮助

以下是发布者代码:

using System;
using NetMQ;
using NetMQ.Sockets;
using System.Threading;

namespace SampleNQPub
{
    class Program
    {
        static void Main(string[] args)
        {
            var addr = "tcp://127.0.0.1:3004";

            using (var pubSocket = new PublisherSocket())
            {
                Console.WriteLine("Publisher socket binding.");
                pubSocket.Options.SendHighWatermark = 10;
                pubSocket.Bind(addr);

                for (int i=0; i < 30; i++)
                {
                    pubSocket.SendMoreFrame("NQ").SendFrame(i.ToString());
                    Thread.Sleep(1000);
                }

                pubSocket.Disconnect(addr);
            }
        }
    }
}
使用系统;
使用NetMQ;
使用NetMQ.Sockets;
使用系统线程;
名称空间SampleNQPub
{
班级计划
{
静态void Main(字符串[]参数)
{
var addr=”tcp://127.0.0.1:3004";
使用(var pubSocket=new PublisherSocket())
{
WriteLine(“发布服务器套接字绑定”);
pubSocket.Options.SendHighWatermark=10;
pubSocket.Bind(addr);
对于(int i=0;i<30;i++)
{
publisocket.SendMoreFrame(“NQ”).SendFrame(i.ToString());
睡眠(1000);
}
pubSocket.断开(addr);
}
}
}
}
以下是订户代码:

using System.Threading;
using NetMQ;
using NetMQ.Sockets;

namespace SampleNQSub
{
    class Program
    {
        static void Main(string[] args)
        {
            var addr = "tcp://127.0.0.1:3004";

            using (var subSocket = new SubscriberSocket())
            {
                subSocket.ReceiveReady += OnReceiveReady;
                subSocket.Options.ReceiveHighWatermark = 10;
                subSocket.Connect(addr);
                subSocket.Subscribe("NQ");

                for (int i=0; i < 20; i++)
                {
                    Thread.Sleep(1000);
                }

                subSocket.Disconnect(addr);
            }
        }

        static void OnReceiveReady(object sender, NetMQSocketEventArgs e)
        {
            var str = e.Socket.ReceiveFrameString();
        }
    }
}
使用系统线程;
使用NetMQ;
使用NetMQ.Sockets;
名称空间SampleNQSub
{
班级计划
{
静态void Main(字符串[]参数)
{
var addr=”tcp://127.0.0.1:3004";
使用(var subscket=newsubscribersocket())
{
子章节接收日期+=接收日期;
subSocket.Options.ReceiveHighWatermark=10;
子容器连接(地址);
分包认购(“NQ”);
对于(int i=0;i<20;i++)
{
睡眠(1000);
}
子容器断开(添加);
}
}
ReceiveReady上的静态无效(对象发送方,NetMQSocketEventArgs e)
{
var str=e.Socket.ReceiveFrameString();
}
}
}

好的,这是NetMQ世界中的一个难题,我刚刚解决了。您必须设置一个NetMQPoller,它将调用您添加到它的每个ReceiveReady回调(NetMQPoller)

下面是更正后的代码,它至少会触发ReceiveReady事件(即ReceiveFrameString仍然只获取“NQ”部分,但这只是另一个要修复的方法调用):

using System.Threading;
using System.Threading.Tasks;
using NetMQ;
using NetMQ.Sockets;

namespace SampleNQSub
{
    class Program
    {
        static void Main(string[] args)
        {
            var addr = "tcp://127.0.0.1:3004";

            NetMQPoller poller = new NetMQPoller();

            using (var subSocket = new SubscriberSocket())
            {
                subSocket.ReceiveReady += OnReceiveReady;
                subSocket.Options.ReceiveHighWatermark = 10;
                subSocket.Connect(addr);
                subSocket.Subscribe("NQ");

                poller.Add(subSocket);
                poller.RunAsync();

                for (int i = 0; i < 20; i++)
                {
                    Thread.Sleep(1000);
                }

                subSocket.Disconnect(addr);
            }
        }

        static void OnReceiveReady(object sender, NetMQSocketEventArgs e)
        {
            var str = e.Socket.ReceiveFrameString();
            e.Socket.ReceiveMultipartStrings();
        }
    }
}
那么,轮询泵的机械装置在哪里呢?(回答:我不在乎!我只是希望在我注册的回调中提供给我的消息。[显然,是开玩笑的。我知道NetMQPoller是多功能的,可以处理更复杂的问题,但对于基本的“在回调中收到消息时给我”,如果它由库内部处理就好了。]

var zmq = require('zmq'), sock = zmq.socket('sub');

sock.connect('tcp://127.0.0.1:3004');
sock.subscribe('NQ');
console.log('Subscriber connected to port 3004');

sock.on('message', function() {
    var msg = [];
    Array.prototype.slice.call(arguments).forEach(function(arg) {
        msg.push(arg.toString());
    });

    console.log(msg);
});