我想在机器之间建立发布订阅通信。
我拥有的两台计算机是ryu-primary
和ryu-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()
有人可以指出给我我做错了什么?
答案 0 :(得分:1)
PUB/SUB
消息传递模式设置使PUB/SUB
模式工作有几个重要步骤。
所有这些都在ZeroMQ文档中有详细描述。
你不需要重复发布和发布。两侧代码的子部分,它掩盖的越多,作为其副作用,如果你在“对面”节点代码中混合pub和子套接字地址/ ports / calls / etc而你看不到这种主要的碰撞。
您的代码定义了PUB
- 原型的初始形式,预期为.push_messages()
您的代码定义了SUB
- 原型的初始形式,预期为.receive_messages()
您的代码不显示,您如何控制谁首先进行连接设置 - .bind()
或.connect()
是随机出现还是出现在/ {在另一个
在实例化SUB
- 原型后,您的代码不显示任何订阅设置。套接字实例化上的默认值确实需要通过.setsockopt( zmq.SUBSCRIBE = '')
方法修改,否则有一个禁止过滤器不允许任何(尚未取消订阅的)消息通过并获得 - SUB
- 侧
您可能已经从ZeroMQ文档中注意到,除非另外设置,否则子方会过滤掉所有传入的消息。
“ZMQ_SUBSCRIBE选项应在ZMQ_SUB套接字上建立新的消息过滤器。新创建的ZMQ_SUB套接字应过滤掉所有传入的消息,因此应将此选项调用为建立初始消息过滤器。
长度为零的空 option_value
将订阅所有传入消息。 非空 option_value
应订阅以指定前缀开头的所有邮件。多个过滤器可能会附加到单个ZMQ_SUB套接字,在这种情况下,如果消息与至少一个过滤器匹配,则将被接受。“
使用pyzmq 13.0+
的python代码还有另一种可能性。在那里你可能也通过Context类方法.setsockopt( zmq.SUBSCRIBE, "" )
等来设置它,但这样的调用必须先于Context-instance pre的新套接字实例化 - 这样配置。