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

时间:2016-06-15 19:23:21

标签: python sockets zeromq

ZMQ中的套接字只是绑定到接口,然后可以立即接收消息,如下所示:

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

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

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

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

此处,可以轻松区分不同的发件人,因为每个发件人都是通过不同的套接字接收的。

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

1 个答案:

答案 0 :(得分:0)

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

REQ - 将回复发送请求的客户端,recv套接字上的REQ呼叫后面必须跟send,因此您无法提供服务下一个请求,直到您处理完第一个请求。但是,来自不同客户端的多个请求将排队。

ROUTER - 将一个框架附加到包含发件人客户端ID的recv邮件上。发送消息时,第一帧将被删除并用于标识要回复的连接客户端。您应该存储所有帧,包括空分隔符帧,并在发送回复时将它们添加到您的回复消息中。与REQ不同,在另一次调用send之前,无需recv任何消息。如果未指定,则ZeroMQ将生成客户端ID,但如果您想要“持久性”,则可以通过setsockopt使用zmq.IDENTITY标记设置ID。