所以我是ZeroMQ的新手,我正在尝试使用PUB / SUB设置使用ZeroMQ发送字节消息.
编程语言的选择对于这个问题并不重要,因为我使用zmq进行多种语言之间的通信.
这是我在python中的服务器代码:
import zmq
import time
port = "5556"
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:%s" % port)
while True:
socket.send(b'\x84\xa5Title\xa2hi\xa1y\xcb\x00\x00\x00\x00\x00\x00\x00\x00\xa1x\xcb@\x1c\x00\x00\x00\x00\x00\x00\xa4Data\x08')
time.sleep(1)
这是我在python中的客户端代码:
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://localhost:5556")
total_value = 0
for update_nbr in range (5):
string = socket.recv()
print (string)
我的客户端只是阻塞在string = socket.recv().
我做了一些研究,显然,如果我要使用PUB / SUB设置发送字符串,我需要设置一些“主题过滤器”以使其工作.但是如果我发送一些字节消息,我不知道该怎么做.
最佳答案
ZeroMQ defines protocols, that guarantee cross-platform compatibility of both the behaviours and the message-content .
根本原因:要开始接收消息,必须更改SUB套接字的初始“主题过滤”状态(最初是“不接收”零预订)
ZeroMQ是一套可爱的工具,围绕智能原理创建.
其中一个说,在SUB方面什么也不做,直到.setsockopt(zmq.SUBSCRIBE,…)明确地说,要订阅什么,开始检查传入的消息(旧的zmq-fans记得初始设计,其中PUB -side总是将所有消息分发到路上,朝向每个连接的SUB-“无线电广播接收器”,在每个消息接收到SUB侧时,它自己执行“主题过滤”.较新版本的zmq反转架构并执行PUB端过滤).
无论如何,“主题过滤器”的初始状态是有道理的.谁知道什么应该先验收到?没有人.所以一无所获.
鉴于您需要或希望开始工作,轻松订阅任何内容……让任何消息都能通过.
是的,那个简单的.setsockopt(zmq.SUBSCRIBE,“”)
如果需要一些基于密钥的处理并且消息具有合理的大小(没有千兆BLOB),那么可以简单地在消息字符串(或有效载荷)前面添加一些密钥(或者如果更多hacky则为字节字段).字节字段).
当然,如果在PUB端执行zmq过滤(对于较旧的API版本无效),可以节省传输层开销的一部分,否则订阅接收“通常没什么大不了” “并在处理其余的消息有效负载之前检查消息是否有一些预先组装的上下文密钥(前缀子字符串,字节字段等).
最佳下一步:
如果您的代码努力进入生产状态,而不仅仅是学术界的例子,那么还需要做更多的工作,为恶劣的现实生产环境提供生存能力测量.
使用ZeroMQ进行真实设计的绝佳观点是Pieter HINTJEN的书“Code Connected,Vol.1”(may check my posts on ZeroMQ to find the book’s direct pdf-link).
此外,另一个好读物来自ZeroMQ的联合之父Martin SUSTRIK,于low-level truths about the ZeroMQ implementation details & scale-ability年