2017-04-19 43 views
0

在我的Tornado應用中,在某些情況下,某些客戶端與服務器斷開連接,但我當前的代碼未檢測到客戶端與服務器斷開連接。我目前使用ping來查明客戶端是否斷開連接。 這裏是我的乒乓代碼:如何在龍捲風中設置連接超時?

from threading import Timer 
class SocketHandler(websocket.WebSocketHandler): 
    def __init__(self, application, request, **kwargs): 
     # some code here 
     Timer(5.0, self.do_ping).start() 
    def do_ping(self): 
     try: 
      self.ping_counter += 1 
      self.ping("") 
      if self.ping_counter > 2: 
       self.close() 
      Timer(60, self.do_ping).start() 
     except WebSocketClosedError: 
      pass 

    def on_pong(self, data): 
     self.ping_counter = 0 

現在我想設置SO_RCVTIMEO在龍捲風而不是使用乒乓方法。 這樣的事情:
sock.setsockopt(socket.SO_RCVTIMEO)
是否有可能在Tornado中設置SO_RCVTIMEO爲特定超時後從服務器關閉客戶端?

+0

@amn如何在Tornado中使用'socket.SO_RCVTIMEO'?我閱讀了文檔,但找不到有用的東西。 – shotgunner

回答

0

SO_RCVTIMEO在像Tornado這樣的異步框架中沒有做任何事情。你可能想把你的閱讀包​​裝在tornado.gen.with_timeout。您仍然需要使用ping來測試連接並確保它仍然正常工作;如果連接處於空閒狀態,系統幾乎不需要通知系統。 (TCP Keepalive是一種可能性,但這些在所有平臺上都不可配置,並且通常使用非常長的超時)。

+0

謝謝。那麼龍捲風我們無法檢測或刷新空閒連接?即使使用'with_timeout'生成器? – shotgunner

+0

您需要定期使用連接才能檢測到故障。一般情況下,TCP都是如此,而不僅僅是Tornado(你需要閱讀'SO_RCVTIMEO'才能在同步應用程序中工作)。在不嘗試使用連接的情況下檢測失敗的唯一方法是TCP保持活動,並具有上述限制。 –

+0

另請注意,WebSocketHandler現在已經內置了Tornado 4.5中的ping和timeout支持,因此對於websockets,您應該使用它而不是構建自己的故障檢測器。 –