2014-02-07 97 views
5

我想使用ZeroMQ rep/req并且无法弄清楚如何处理服务器端错误。看看代码hereZeroMQ REQ/REP服务器错误处理

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,连接隐式管理,我不知道是否有可能打破“会话”或“连接”并重新开始。

回答

3

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

socket.close()

如果你需要等待一个消息,但最多只能为有限的时间量,你可以通过一个timeout标志socket.recv(timeout=1024),然后处理超时错误情况下,你会以同样的方式时,TCP套接字超时或断开连接。如果你需要管理几个套接字,所有这些套接字都可能处于错误状态,那么Poller类可以让你完成这个。

+0

在服务器端,如果我使用socket.close(),是否关闭与客户端实例对应的会话,还是关闭了每个会话,还是关闭了侦听套接字? –

+0

取决于套接字类,REQ/REP与PUB/SUB等有不同的行为。 –

+0

我只对REP套接字感兴趣。 –

1

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

我认为chapter 4可能是你感兴趣的,尤其是懒惰海盗模式。

查看Lazy Pirate ServerLazy Pirate Client的示例。

+1

我看过那些。它们提供客户端可靠性。我的问题更简单。我只是想确保REP服务器不会卡住。 –