对于发送字符串数据,以下代码有效:
context = zmq.Context()socket = context.socket(zmq.PUB)socket.bind( “TCP:// *:5667”)socket.send_string(“我的字符串数据”)用于发送图像(ndarray)…
我猜你在找 多部分消息 ,允许您从几个帧组成一个消息。 Python实现 pyzmq 已经为我们提供了一个很好的多部分消息包装器。这是一个例子 的 服务器 强> 发送多部分消息:
pyzmq
context = zmq.Context() socket = context.socket(zmq.PUB) socket.bind("tcp://*:5555") time.sleep(0.2) # wait for socket to be properly bound socket.send_multipart([b"first part", b"second part"])
而且 的 客户 强> 收到多部分消息:
context = zmq.Context() socket = context.socket(zmq.SUB) socket.setsockopt(zmq.SUBSCRIBE, b"") socket.connect("tcp://localhost:5555") print(socket.recv_multipart())
使用多部分消息时请考虑以下事项:
在您的具体示例中,您已经在编写了多部分消息 send_array 通过使用标志功能 zmq.SNDMORE 。我们可以通过添加字符串数据来扩展您的示例 zmq.SNDMORE 旗。这里是 的 服务器 强> 侧:
send_array
zmq.SNDMORE
def send_array_and_str(socket, img, string, flags=0): md = dict(dtype = str(img.dtype), shape=img.shape) socket.send_string(string, flags | zmq.SNDMORE) socket.send_json(md, flags | zmq.SNDMORE) return socket.send(img, flags) context = zmq.Context() socket = context.socket(zmq.PUB) socket.bind("tcp://*:5667") time.sleep(0.2) my_ndarray = np.array([1, 2, 3]) my_string = "Hello World" send_array_and_str(socket, my_ndarray, my_string)
而且 的 客户 强> 接收邮件的代码:
def recv_array_and_str(socket, flags=0, copy=True, track=False): string = socket.recv_string(flags=flags) md = socket.recv_json(flags=flags) msg = socket.recv(flags=flags, copy=copy, track=track) img = np.frombuffer(bytes(memoryview(msg)), dtype=md['dtype']) return string, img.reshape(md['shape']) context = zmq.Context() socket = context.socket(zmq.SUB) socket.setsockopt(zmq.SUBSCRIBE, b"") socket.connect("tcp://localhost:5667") print(recv_array_and_str(socket))
此代码基于示例 使用PyZMQ序列化消息 并适用于Python 3.对于Python 2,请考虑使用 buffer(msg) 代替 bytes(memoryview(msg)) 。
buffer(msg)
bytes(memoryview(msg))