ZMQ中的套接字只是绑定到接口,然后可以立即接收消息,如下所示:
socket.bind("tcp://*:5555")
message = socket.recv()
由于多个连接可以同时向该套接字发送数据,如何区分不同的发件人?
另一方面,对于常规套接字,首先接受传入连接,这会产生一个新的套接字,如下所示:
serversocket.bind((socket.gethostname(), 5555))
serversocket.listen()
(clientsocket, address) = serversocket.accept()
此处,可以轻松区分不同的发件人,因为每个发件人都是通过不同的套接字接收的。
从ZMQ的基于便捷消息和队列缓冲的通信中受益的最佳方式是什么,但是在请求它们时仍然会创建任意数量的可区分的一对一连接?
答案 0 :(得分:0)
如何区分不同的客户端取决于您使用哪种套接字类型作为“服务器”,下面的解释也有望回答第二个问题。
REQ
- 将回复发送请求的客户端,recv
套接字上的REQ
呼叫后面必须跟send
,因此您无法提供服务下一个请求,直到您处理完第一个请求。但是,来自不同客户端的多个请求将排队。
ROUTER
- 将一个框架附加到包含发件人客户端ID的recv
邮件上。发送消息时,第一帧将被删除并用于标识要回复的连接客户端。您应该存储所有帧,包括空分隔符帧,并在发送回复时将它们添加到您的回复消息中。与REQ
不同,在另一次调用send
之前,无需recv
任何消息。如果未指定,则ZeroMQ将生成客户端ID,但如果您想要“持久性”,则可以通过setsockopt
使用zmq.IDENTITY
标记设置ID。