2014-02-07 136 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服務器不會卡住。 –