为什么简单的发布订阅不能与zeromq一起使用?

时间:2014-10-11 23:00:18

标签: python-3.x ipc zeromq publish-subscribe

我想在机器之间建立发布订阅通信。

我拥有的两台计算机是ryu-primaryryu-secondary

我在每台机器中遵循的步骤如下:

ryu-primary的初始值设定项中(IP地址为192.168.241.131)

 self.context    = zmq.Context()
 self.sub_socket = self.context.socket(zmq.SUB)
 self.pub_socket = self.context.socket(zmq.PUB)
 self.pub_port   = 5566
 self.sub_port   = 5566


def establish_zmq_connection(self):                      # Socket to talk to server
    print( "Connection to ryu-secondary..." )
    self.sub_socket.connect( "tcp://192.168.241.132:%s" % self.sub_port )

def listen_zmq_connection(self):
    print( 'Listen to zmq connection' )
    self.pub_socket.bind( "tcp://*:%s" % self.pub_port )

def recieve_messages(self):
    while True:
        try:
            string = self.sub_socket.recv( flags=zmq.NOBLOCK )
            print( 'flow mod messages recieved {}'.format(string) )
            return string
        except zmq.ZMQError:
            break

def push_messages(self,msg):
    self.pub_socket.send( "%s" % (msg) )

来自ryu-secondary(IP地址 - 192.168.241.132)

在初始化程序中

    self.context    = zmq.Context()
    self.sub_socket = self.context.socket(zmq.SUB)
    self.pub_socket = self.context.socket(zmq.PUB)
    self.pub_port   = 5566
    self.sub_port   = 5566


def establish_zmq_connection(self):                     # Socket to talk to server
     print( "Connection to ryu-secondary..." )
     self.sub_socket.connect( "tcp://192.168.241.131:%s" % self.sub_port )

def listen_zmq_connection(self):
     print( 'Listen to zmq connection' )
     self.pub_socket.bind( "tcp://*:%s" % self.pub_port )

def recieve_messages(self):
    while True:
        try:
            string = self.sub_socket.recv( flags=zmq.NOBLOCK )
            print( 'flow mod messages recieved {}'.format(string) )
            return string
        except zmq.ZMQError:
            break

def push_messages(self,msg):
    print( 'pushing message to publish socket' )
    self.pub_socket.send( "%s" % (msg) )

这些是我的功能。

我正在呼叫ryu-secondary

establish_zmq_connections()
push_messages() 

但是当我致电

时,我<{>>没有收到 ryu-primary上的邮件
listen_zmq_connection()
recieve_messages() 

有人可以指出给我我做错了什么?

1 个答案:

答案 0 :(得分:1)

修复PUB/SUB消息传递模式设置

使PUB/SUB模式工作有几个重要步骤。

所有这些都在ZeroMQ文档中有详细描述。

你不需要重复发布和发布。两侧代码的子部分,它掩盖的越多,作为其副作用,如果你在“对面”节点代码中混合pub和子套接字地址/ ports / calls / etc而你看不到这种主要的碰撞。

  1. 您的代码定义了PUB - 原型的初始形式,预期为.push_messages()

  2. 您的代码定义了SUB - 原型的初始形式,预期为.receive_messages()

  3. 您的代码显示,您如何控制谁首先进行连接设置 - .bind().connect()是随机出现还是出现在/ {在另一个

  4. 之后
  5. 在实例化SUB - 原型后,您的代码显示任何订阅设置。套接字实例化上的默认值确实需要通过.setsockopt( zmq.SUBSCRIBE = '')方法修改,否则有一个禁止过滤器不允许任何(尚未取消订阅的)消息通过并获得 - SUB - 侧

  6. 的输出(“已收到”)

    必须修改默认的SUB端订阅过滤器,这是禁止的

    您可能已经从ZeroMQ文档中注意到,除非另外设置,否则子方会过滤掉所有传入的消息。

      

    http://api.zeromq.org/2-1:zmq-setsockopt

    “ZMQ_SUBSCRIBE选项应在ZMQ_SUB套接字上建立新的消息过滤器。新创建的ZMQ_SUB套接字应过滤掉所有传入的消息,因此将此选项调用为建立初始消息过滤器。

    长度为零的 option_value将订阅所有传入消息。 非空 option_value应订阅指定前缀开头的所有邮件。多个过滤器可能会附加到单个ZMQ_SUB套接字,在这种情况下,如果消息与至少一个过滤器匹配,则将被接受。“


    可能的Context实例的类方法预配置

    使用pyzmq 13.0+的python代码还有另一种可能性。在那里你可能也通过Context类方法.setsockopt( zmq.SUBSCRIBE, "" )等来设置它,这样的调用必须先于Context-instance pre的新套接字实例化 - 这样配置。