所以我是 ZeroMQ 的新手,我正在尝试使用 ZeroMQ 发送字节消息,使用 PUB / SUB
环境。
编程语言的选择对于这个问题并不重要,因为我使用 ZeroMQ 进行多种语言之间的通信。
这是我在 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
-side 上什么都不做,直到 .setsockopt( zmq.SUBSCRIBE, ... )
明确说,要订阅什么,开始检查传入的消息(请记住 zmq-fans初始设计,其中 PUB
-side 始终将所有消息分发到每个连接的 SUB
-“广播接收器接收每个广播消息”, SUB
-side 自行执行“主题过滤”。较新版本的 zmq 反转架构并执行 PUB
-side 过滤)。无论如何,“主题过滤器”的初始状态是有道理的。谁知道应该事先收到什么?没有人。所以什么也得不到。
考虑到您需要或希望开始这项工作,订阅任何内容的简单举动......让我们通过任何消息。
是的,就是这么简单
.setsockopt( zmq.SUBSCRIBE, "" )
如果需要一些基于 key 的处理并且消息具有合理的大小(没有 giga-BLOB),则可以简单地在消息字符串(或有效载荷字节字段)。
当然,如果在
PUB
端执行 zmq 过滤(对旧 API 版本无效),则可以节省一部分传输层开销,否则通常不会在处理消息有效负载的其余部分之前,订阅接收“任何东西”并检查一些预组装的上下文键(前缀子字符串、字节字段等)的消息是一件大事。最好的下一步:
如果您的代码努力进入生产状态,而不仅仅是作为学术界的例子,则必须做更多的工作,为敌对的现实世界生产环境提供生存性措施。
Pieter HINTJEN 的书 “Code Connected, Vol.1” ( may check my posts on ZeroMQ to find the book's direct pdf-link ) 是执行此操作的绝对好视角 以及使用 ZeroMQ 进行现实设计的好读物。
另外另一个很好的读物来自 Martin SUSTRIK,ZeroMQ 的共同之父,在 low-level truths about the ZeroMQ implementation details & scale-ability
关于zeromq - 如何使用 ZeroMQ PUB/SUB 设置发送字节消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41529415/