2012-08-02 99 views
9

我目前在Python中使用zmq。服务器正在使用REP套接字。ZMQ REP,知道是谁发送请求

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

回答

2

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

这就是说,只是建立发件人信息到消息。这应该是微不足道的(无论是使用UUID还是每个客户端的特定名称)。

+0

非常感谢。 是的,我的信息将包含发件人信息(可能还不确定)。我宁愿从套接字获取信息,因为让用户提供信息可以让他做session_hijack(即使这种情况不太可能,我同意) – user1572602 2012-08-03 14:58:48

+0

好吧,你不要让他们设置ID。他们在认证过程后得到他们的使用权。这个新的uid每次授权都会改变。这基本上消除了会话劫持的任何威胁。 – g19fanatic 2012-08-04 18:23:43

+0

此外,如果这个答案是有帮助的,请将它标记为:) – g19fanatic 2012-08-04 18:25:08

14

看起来您希望在服务器端实现异步请求处理:让服务器接受请求,异步处理它们,并在响应数据可用于每个请求时将响应发送回客户端。现在当然了:在完成处理请求之后,您会如何知道哪个客户端将其发回?

使用简单的REP套接字,ØMQ通过强制recv() -> send(), recv() -> send()序列性确保您不会遇到这类问题。换句话说,在REP套接字上执行recv()之后,在执行recv()之前再次执行send()。回复将发回给您收到消息的客户,毫无疑问,客户的地址是一次只有一个客户。

但是,当你想并行处理请求时,这并没有什么帮助,是吗?有很多情况下,REP的行为过于严格,这正是Multipart消息和ROUTER(或XREP)套接字的用途。 XREP打破了REP的锁步,但这导致了我们前面看到的一个问题 - 如果许多连接,您如何将回复发回给发送请求的客户端?为了实现这个功能,ZeroMQ中的XREP将消息部分添加到消息的前面,如信封,其中包括它请求的连接的标识。

ZMQ指南中有关于advanced Request-Reply patterns的所有章节。您还可以找到一个例子来处理异步请求here以及ZeroMQ连接处理here的简短说明。