Python 中的 ZMQ:每个传入连接的新套接字对象

ZMQ in Python: New socket object for each incoming connection

ZMQ 中的套接字简单地绑定到一个接口,然后能够立即接收消息,如下所示:

socket.bind("tcp://*:5555")
message = socket.recv()

由于多个连接可以同时向该套接字发送数据,如何区分不同的发送者?

另一方面,对于常规套接字,首先接受传入连接,这会产生一个新套接字,如下所示:

serversocket.bind((socket.gethostname(), 5555))
serversocket.listen()
(clientsocket, address) = serversocket.accept()

在这里,可以很容易地区分不同的发送者,因为每个发送者都是通过不同的套接字接收的。

从 ZMQ 的方便的基于消息和队列缓冲的通信中获益的最佳方式是什么,但仍然在请求时立即创建任意数量的可区分的一对一连接?

如何区分不同的客户端取决于您使用的套接字类型作为您的 'server',下面的解释也有望回答第二个问题。

REQ - 将回复发送请求的客户端,对 REQ 套接字的 recv 调用必须后跟 send,这样你就可以'在处理完第一个请求之前,不要为下一个请求提供服务。但是,来自不同客户端的多个请求将排队。

ROUTER - 将在您 recv 的消息上附加一个框架,其中包含发件人的客户端 ID。发送消息时,第一帧将被删除并用于标识要回复哪个连接的客户端。您应该存储直到并包括空定界符帧的所有帧,并在您发送回复时将它们添加到您的回复消息中。与 REQ 不同,不需要 send 在再次调用 recv 之前发送任何消息。如果未指定,客户端 ID 将由 ZeroMQ 生成,但如果你想要 'persistence',你可以通过 setsockoptzmq.IDENTITY 标志设置 ID。