如何在龙卷风中设置连接超时?

时间:2017-04-19 11:56:51

标签: python sockets websocket tornado ping

在某些情况下,在我的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而不是使用ping pong方法。 这样的事情:
sock.setsockopt(socket.SO_RCVTIMEO)
在特定的超时后,是否可以在Tornado中为服务器中的关闭客户端设置SO_RCVTIMEO?

1 个答案:

答案 0 :(得分:0)

- \renewcommand{\contentsname}{} 在像Tornado这样的异步框架中没有做任何事情。您可能希望将您的读取包装在SO_RCVTIMEO中。您仍然需要使用ping测试连接并确保它仍在工作;如果连接空闲,则几乎不能保证系统需要多长时间才能注意到。 (TCP keepalive是可能的,但是这些在所有平台上都不可配置,并且通常使用很长的超时)。