【问题标题】:NetMQ in Publisher and subscriber not working发布者和订阅者中的 NetMQ 不起作用
【发布时间】:2014-10-06 17:16:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: c#-4.0 zeromq netmq


    【解决方案1】:

    如果您是 NetMQ 新手,我建议您阅读 zeromq 指南http://zguide.zeromq.org/page:all

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

    zeromq 和 NetMQ 中的 Pubsub 就像收音机一样,您只会从开始收听的那一刻起收到消息。

    简单的方法(不是现实生活中的解决方案)是在连接后休眠一段时间。

    对于现实生活中的解决方案,我需要了解您想要实现的目标

    【讨论】:

    • 我将 serverTask() 作为控制台应用程序运行。因为 subscriotion 是空的,我猜它会监听所有的订阅主题。一旦完成。我正在向一些 API 发出请求,这些 API 在内部调用 ClientTask()。根据我的想法,服务器在 while(true) 中,它将继续查看提到的地址,并且一旦发布任何消息,它就会显示出来。
    • 您可能希望将发布者视为服务器,将客户端视为订阅者。无论如何,正如我之前所说,NetMQ 中的 Pubsub 就像收音机一样,如果你需要其他东西,你可能会选择死机和路由器模式。阅读指南,它可能会回答您的所有问题等等。
    • 您没有按照上述情况进行回复。很抱歉,但你的通用句子没有帮助。说到你的点,ZeroMQ 不支持 N -publisher 1 sub 以及 1Publisher 和 nSubscriber。如果你知道请告诉我当前的实现有什么问题。如果您想了解更多信息,我很乐意分享。
    • 您的方案的答案:在订阅者将订阅发送到服务器之前,您要在发布者上发送消息。为了避免这种情况,请在发布者连接后休眠 100 毫秒。在 netmq 中,发布者根据订阅过滤消息,在发布者连接订阅者后,将订阅发送给发布者。但是在您的场景中,您是在发布者收到客户端订阅之前发送消息。
    • 谢谢。它有帮助。但根据你的建议,我不能交换发布者和订阅者。我需要从实际上用于记录的客户端任务发送数据。 ServerTask 需要接收发布者无法完成的数据。在这种情况下建议使用哪种 ZeroMQ 模型。
    【解决方案2】:

    问题就像

            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) 循环移到外面。并从其他函数调用此代码,这会强制每次都将推送套接字和上下文创建为新的......这不起作用。

    【讨论】:

    • 兄弟,我认为绑定后需要一些时间。所以如果我进入 Thread.Sleep (200) 它开始工作。但我不明白原因。
    • 在您的 pubsub 示例中,发布者是连接者,现在发布者正在执行绑定。如果发布者将进行连接,一切都会正常工作。现在的问题是,当您绑定时,您不知道何时有人会连接,如果您尝试发送消息而没有其他对等方连接,则消息将被丢弃。
    • 同样使用 NetMQ 更好的做法是创建一次上下文,同样不建议在同一个绑定地址上创建和处理套接字很多时间,并且可能无法正常工作。您可以在系统的整个生命周期中创建一次吗?
    • pushSocket 必须绑定对吗?所以我就是这样做的其次,我读了那件事,一劳永逸。我将上下文创建为静态,但有时在绑定时会出错。 :( 虽然我在 Application_End 使用终止
    • 绑定和连接的锯切帮助了人。它的工作。非常感谢
    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多