如何在Twisted中使用带有端点的TCP Keepalive?

时间:2013-12-26 23:29:35

标签: python tcp twisted

Twisted支持TCP Keepalive。但我找不到在端点(客户端和服务器)上设置它们的简单方法。

目前最好的做法是什么?

1 个答案:

答案 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,可能不适合服务器。