我正在尝试使用ZeroMQ rep / req,但无法弄清楚如何处理服务器端错误。查看here中的代码:
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,我可以隐式管理连接,但我不知道是否可以打破“会话”或“连接”并重新开始。
答案 0 :(得分:6)
您可以像终止TCP套接字一样终止ZMQ套接字。
socket.close()
如果你需要等待一条消息,但只有一段有限的时间,你可以将timeout
标志传递给socket.recv(timeout=1024)
,然后像处理时一样处理超时错误情况。 TCP套接字超时或断开连接。如果您需要管理多个可能处于错误状态的套接字,那么Poller
类将允许您完成此操作。
答案 1 :(得分:2)
答案 2 :(得分:0)
一般来说,
setsockopt()
send
和recv
不会永久阻止。 (临时阻止 - 无论是客户端还是服务器 - 都可以,但无限阻塞是不好的,因为你的应用程序不能做任何事情)close()
当前套接字并重新创建新套接字以建立新连接