C# 4.0 发布服务器和订阅服务器中的NetMQ不工作

C# 4.0 发布服务器和订阅服务器中的NetMQ不工作,c#-4.0,zeromq,netmq,C# 4.0,Zeromq,Netmq,我正在尝试实现NetMQ发布/订阅模型,但订阅者没有收到任何消息。这里可能出了什么问题 private static void ServerTask() { using (var context = NetMQContext.Create()) { using (var socket = context.CreateSubscriberSocket()) { socket.

我正在尝试实现NetMQ发布/订阅模型,但订阅者没有收到任何消息。这里可能出了什么问题

  private static void ServerTask()
    {
        using (var context = NetMQContext.Create())
        {
            using (var socket = context.CreateSubscriberSocket())
            {
                socket.Bind("tcp://10.120.19.109:5000");
                socket.Subscribe(string.Empty);

                while (true)
                {
                    Thread.Sleep(100);
                    string receivedMessage = socket.ReceiveString();
                    Console.WriteLine("Received: " + receivedMessage);
                }
            }
        }
    }

     public static void ClientTask()
    {
        using (NetMQContext ctx = NetMQContext.Create())
        {
            using (var socket = ctx.CreatePublisherSocket())
            {
                socket.Connect("tcp://10.120.19.109:5000");

                string obj = "hi";
                socket.Send(obj);
            }
        }
    }

两者都在不同的应用程序中。

如果您是NetMQ新手,我建议您阅读zeromq指南

底线是您在订户发送订阅之前发送消息

zeromq和NetMQ中的Pubsub类似于无线电,您只能从开始侦听的那一刻起获取消息

要做到这一点,最简单的方法(不是现实生活中的解决方案)是在连接后睡一段时间

对于现实生活中的解决方案,我需要了解您试图实现的目标是什么

        using (NetMQContext ctx = NetMQContext.Create())
        {
            using (var publisher = ctx.CreatePushSocket())
            {

                publisher.Bind("tcp://localhost:5000");

                int i = 0;
                while (true)
                {
                    try
                    {

                        publisher.Send(i.ToString(), dontWait:true);
                        Console.WriteLine(i.ToString());
                    }
                    catch (Exception e)
                    {

                    }
                    finally
                    {
                        i++;
                    }

            }
        }

现在,这段代码起作用了。但是如果我把while(true)循环移到外面。并从其他函数调用此代码,该函数强制每次将推送套接字和上下文创建为新的。。这不起作用。

我正在将serverTask()作为控制台应用程序运行。因为subscription是空的,所以我猜它将收听所有订阅主题。一旦它完成了。我向某个API发出请求,该API在内部调用ClientTask()。根据我的想法,当服务器处于(true)时,它将继续查看所提到的地址,并且它应该在任何消息发布后立即显示。您可能要考虑发布服务器是服务器,而客户端是订阅服务器。无论如何,正如我之前所说,NetMQ中的Pubsub就像收音机一样,如果您需要其他东西,您可能会选择更死板的路由器模式。阅读该指南,它可能会回答您所有的问题,甚至更多。您不会根据上述场景给出答复。很抱歉,你的泛化句子毫无帮助。现在,ZeroMQ不支持任何N-发布者1 sub以及1发布者和nSubscriber。如果你知道的话,请告诉我当前的实现有什么问题。如果您想要更多信息,我很乐意与您分享。您的方案的答案是:在订阅者将订阅发送到服务器之前,您正在发布者上发送消息。为了避免这种情况,请在发布服务器连接后休眠100毫秒。在netmq中,发布服务器根据订阅过滤消息,在发布服务器连接订阅服务器后,将订阅发送到发布服务器。但是,在您的场景中,您是在发布者收到客户端订阅之前发送消息的。谢谢。这有帮助。但根据你的建议,我不能交换发行者和订阅者。我需要从客户端任务发送数据,这实际上是我用来记录日志的。ServerTask需要接收publisher无法完成的数据。在这个场景中,哪个ZeroMQ模型会被推荐。兄弟,我认为绑定之后需要一些时间。所以,如果我进入Thread.Sleep(200),它就会开始工作。但我不明白原因。在您的pubsub示例中,发布者是连接的,现在发布者正在进行绑定。如果出版商愿意做连接,一切都会很好。现在的问题是,当您绑定时,您无法知道何时会有人连接,如果您试图在没有其他对等方连接的情况下发送消息,则消息将被丢弃。此外,使用NetMQ,最好只创建一次上下文,另外,不建议在同一绑定地址上长时间创建和处理套接字,这可能不会很好地工作。你能在整个系统生命周期中创建一次吗?pushSocket必须绑定对吗?所以我是这样做的,第二,我读了那篇文章,一劳永逸。我将上下文创建为静态,但在绑定时会出现错误:(虽然我使用了Bind and Connect的terminate at Application_endsawping帮助了man。它可以工作。非常感谢