发布者和订阅者中的NetMQ无法正常工作

时间:2014-08-13 11:09:27

标签: c#-4.0 zeromq netmq

我尝试实施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);
            }
        }
    }

两者都在不同的应用中。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

答案 1 :(得分:0)

问题就像

        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)循环移到外面。并从其他函数中调用此代码,这会强制每次都将push socket和context创建为new ..这不起作用。