11

我目前正在将 zmq 与 python 一起使用。服务器正在使用 REP 套接字。

我有办法在接收消息时知道是谁发送的吗?如果收到 2 条消息,我只需要知道它们是否来自同一个用户,因此例如 uid 就足够了。

4

2 回答 2

17

看起来您想在服务器端实现异步请求处理:您让服务器接受请求,异步处理它们,并在响应数据可用于每个请求时将响应发送回客户端。当然现在:在处理完请求后,您怎么知道将请求发回给哪个客户端?

recv() -> send(), recv() -> send()使用简单的 REP 套接字,ZMQ 通过强制执行顺序确保您不会遇到此类问题。换句话说,在你recv()对一个 REP 套接字执行 a 之后,你必须再次从它执行 a send()before 。recv()响应将被发送回您收到消息的客户端,并且客户端的地址毫无疑问,因为它一次只有一个客户端。

但是,当您想要并行化请求处理时,这并没有真正的帮助,不是吗?在很多情况下,REP 的行为过于严格,而这正是 Multipart 消息和 ROUTER(或 XREP)套接字的用途。XREP 打破了recv() -> send()REP 的锁步,但这会导致我们之前看到的问题 - 如果连接了多个客户端,您如何知道将回复发送回哪个客户端?为了完成这项工作,ZMQ 中的 XREP 在消息的前面添加了一个消息部分,例如信封,其中包括它recv()发出请求的连接的标识。

ZMQ 指南中有一整章介绍了高级请求-回复模式。您还可以在此处找到处理异步请求的示例,并在此处找到有关 ZMQ 连接处理的简短说明

于 2012-10-30T10:08:44.910 回答
2

阅读http://zguide.zeromq.org/page%3aall#Transient-vs-Durable-Sockets,您只能获取您正在使用的套接字的身份......而不是您连接的任何对等方的套接字到。

话虽这么说,只需将发件人信息构建到消息中即可。这应该是微不足道的(使用 UUID 或每个客户端的特定名称)。

于 2012-08-03T11:41:54.520 回答