如何在扭曲中使用 TCP Keepalive with Endpoints



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

执行此操作的当前最佳实践是什么?

我看不出您可以通过 API 从端点干净地实现这一目标的方法。但是,请查看要twisted.internet.endpoints._WrappingProtocol的源 - 您可以将端点设置为使用 _WrappingFactory *,该 * 在建立连接时回调延迟。此时,在协议上设置了传输,您可以调用setTcpKeepAlive

鉴于类名中的下划线,我会说这些是内部使用的,我不依赖于它们的接口在版本之间保持一致。您应该将它们用作指南。

或者,只需在协议connectionMade调用self.transport.setTcpKeepAlive并处理不支持这种情况的情况(即协议用于其他传输)。

#!/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,可能不适合服务器。

最新更新