Twisted支持TCP Keepalive。但我找不到在端点(客户端和服务器)上设置它们的简单方法。
目前最好的做法是什么?
答案 0 :(得分:4)
我看不出通过API干净地从终端实现这一目标的方法。但是,请查看twisted.internet.endpoints._WrappingProtocol
的源代码 - 您可以将端点设置为使用_WrappingFactory
*,在建立连接时回调延迟。此时,在协议上设置传输,您可以调用setTcpKeepAlive
。
考虑到类名中的下划线,我会说这些是内部使用的,我不会依赖于它们之间的接口在发行版之间保持一致。你应该用它们作为指导。
或者,只需在协议的self.transport.setTcpKeepAlive
中调用connectionMade
,并处理不支持此协议的情况(即协议用于其他传输的位置)。
#!/usr/bin/python
# based on example at http://twistedmatrix.com/pipermail/twisted-python/2008-June/017836.html
from twisted.internet import protocol
from twisted.internet import reactor
class EchoProtocol(protocol.Protocol):
def connectionMade(self):
print "Client Connected Detected!"
### enable keepalive if supported
try:
self.transport.setTcpKeepAlive(1)
except AttributeError: pass
def connectionLost(self, reason):
print "Client Connection Lost!"
def dataReceived(self, data):
self.transport.write(data)
factory = protocol.Factory()
factory.protocol = EchoProtocol
reactor.listenTCP(8000, factory)
reactor.run()
对于这个简单的例子,我觉得这提供了一个相当干净的解决方案,但是有可能需要附加的包装器代码。
*请注意_WrappingFactory
子类ClientFactory
,可能不适合服务器。