9

我正在尝试使用 ZeroMQ rep/req,但无法弄清楚如何处理服务器端错误。从这里查看代码:

socket.bind("tcp://*:%s" % port)
while True:
    #  Wait for next request from client
    message = socket.recv()
    print "Received request: ", message
    time.sleep (1)  
    socket.send("World from %s" % port)

我的问题是如果客户端调用 socket.send() 然后挂起或崩溃会发生什么。服务器不会永远卡在 socket.send() 或 socket.recv() 上吗?

请注意,这不是 TCP 套接字的问题。使用 TCP 套接字,我可以简单地断开连接。使用 ZMQ,连接为我隐式管理,我不知道是否可以中断“会话”或“连接”并重新开始。

4

3 回答 3

6

您可以像终止 TCP 套接字一样终止 ZMQ 套接字。

socket.close()

如果您需要等待消息但只能等待有限的时间,您可以将timeout标志传递给socket.recv(timeout=1024)然后处理超时错误情况,就像当 TCP 套接字超时或断开连接时一样。如果您需要管理多个套接字,所有这些套接字都可能处于错误状态,那么Poller该类将让您完成此操作。

于 2014-02-07T22:33:54.573 回答
2

ZMQ Z-guide提供了很多关于如何构建服务以处理不同场景的良好提示。

我认为第 4 章可能会让您感兴趣,尤其是懒惰的海盗模式。

查看Lazy Pirate ServerLazy Pirate Client的示例。

于 2014-02-08T16:14:10.517 回答
0

一般来说,

  1. 确保您setsockopt()在套接字上send并且recv不会永远阻塞。(临时阻塞——无论是客户端还是服务器——都可以,但无限阻塞是不好的,因为你的应用程序不能做任何其他事情)
  2. 如果任何 I/O 出现错误,
    • 如果你是客户端,close()当前socket又重新创建一个新的建立新的连接
    • 如果您是服务器,则无事可做,您只是在等待新的连接。您将想要探索Poller类。
于 2018-05-29T13:50:19.263 回答