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