【发布时间】:2016-11-10 01:39:09
【问题描述】:
python 2.7 和 python 3.5 之间的字节数组和 str 类型似乎是 pyzmq PUB/SUB 的问题。 我必须在 python 2.7 和 python 3.5 中发布/订阅代理一个。 我有一个订阅者同时订阅了 pub/sub 代理,但它没有收到所有已发布的消息。 如何让我的 pub/sub 代理订阅并重新发布在 IP:Port 上发布的所有消息?
示例代码:
def subscribeformessages(self):
context = zmq.Context(1)
xsub = context.socket(zmq.SUB)
xsub_url = "tcp://%s:%s" % (self.ipaddress, self.xsub_url)
xsub.setsockopt_string(zmq.SUBSCRIBE, '')
xsub.setsockopt(zmq.SUBSCRIBE, b'')
if not is_py2:
xsub.setsockopt_string(zmq.SUBSCRIBE, "")
else:
xsub.setsockopt(zmq.SUBSCRIBE, "")
xsub.setsockopt(zmq.SUBSCRIBE, b"")
xsub.setsockopt_unicode(zmq.SUBSCRIBE, u"", encoding='utf-8')
xsub.setsockopt_string(zmq.SUBSCRIBE, u"")
xsub.connect(xsub_url)
try:
while self.running:
try:
time.sleep(.2)
receive = xsub.recv_multipart()
self.print_message_queue.put("sub recv\'d: %s" % receive)
self.pub_local_que.put(receive)
self.publish_queue.put(receive)
except zmq.ZMQError as err:
print(err)
....
发布者示例:
def sendtopicerequesttoexchange(self):
context = zmq.Context(1).instance()
sock = context.socket(zmq.PUB)
sock.linger = 0
try:
sock.bind("tcp://ip:port")
except:
sock.connect("tcp://ip:port")
topicxml = xmltree.Element("MessageXML")
topicxml.attrib['NodeAddr'] = '040000846'
topicxml.attrib['Payload'] = 'HeyBob'
replymsg = xmltree.tostring(topicxml)
msg = [str.encode("send.downlink"), str(replymsg).encode('utf-8')]
msg[0] = str(msg[0]).encode('utf-8')
try:
count = 0
while True:
time.sleep(4)
sock.send_multipart(msg)
print("msg %s" %(msg))
count += 1
if count > 1:
break
time.sleep(.2)
except Exception as bob:
print(bob)
finally:
time.sleep(5)
sock.setsockopt(zmq.LINGER, 0)
sock.close()
有什么想法吗?
【问题讨论】:
-
在这里找到答案:pyzmq.readthedocs.io/en/latest/pyversions.html 确保强制字节数组 b'%s'
标签: python python-3.x zeromq pyzmq