【发布时间】:2012-08-08 08:00:18
【问题描述】:
我正在使用 LineReceiver 协议运行 Twisted 服务器。有时客户端会静默断开连接,因此 Twisted 保持连接打开。并且因为除非请求服务器,否则服务器不会发送任何内容,因此永远不会出现 TCP 超时。换句话说,有些连接永远不会在服务器端关闭。
我怎样才能让 Twisted 关闭几个小时不活动的连接?
【问题讨论】:
我正在使用 LineReceiver 协议运行 Twisted 服务器。有时客户端会静默断开连接,因此 Twisted 保持连接打开。并且因为除非请求服务器,否则服务器不会发送任何内容,因此永远不会出现 TCP 超时。换句话说,有些连接永远不会在服务器端关闭。
我怎样才能让 Twisted 关闭几个小时不活动的连接?
【问题讨论】:
您可以使用reactor.callLater 安排定时事件。基于此,有一个为协议添加超时的助手,twisted.protocols.policies.TimeoutMixin。
另一种方法是使用 TCP keep-alives,您可以使用传输的 setTcpKeepAlive 方法启用它。
另一种方法是使用应用程序级别的保活。基本上偶尔发送一个“noop”。它不需要回应。如果连接已经丢失,发送缓冲区中的额外数据将导致 TCP 堆栈最终注意到。
另请参阅FAQ entry。
【讨论】:
TimeoutMixin 和 reactor.callLater 的用途。