使用Twisted检查连接是否已关闭

时间:2017-12-01 07:00:10

标签: python twisted twisted.internet

我使用Twisted编写代理服务器,但我在检查与服务器的连接是否已关闭时遇到问题。

就像现在一样,我有

客户< - >代理< - >服务器

使用telnet进行测试,代理成功地将消息从客户端传递到服务器,并将服务器响应传递回客户端。但是,我的问题是如果客户端发出命令来关闭代理和服务器之间的连接,客户端和代理之间的连接仍然存在。

以下是我的一些代码

    client_factory = protocol.ClientFactory()
    client_factory.protocol = ClientTelnetProtocol
    client_factory.proxy = self

    try: 
        clientsocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
        clientsocket.connect(('localhost', 1234))
        clientsocket.close()
        reactor.connectTCP('localhost', 1234, client_factory)
    except Exception as err:
        print(err)
        self.transport.loseConnection()

在第

reactor.connectTCP('localhost', 1234, client_factory) 

我希望能够监视连接的状态并查看服务器是否关闭它,可能是在dataReceived()上,或者如果可能的话,在服务器关闭与代理的连接时设置了一个中断,并且代理立即关闭与客户端的连接。

1 个答案:

答案 0 :(得分:1)

ITransport会通过致电IProtocol提供商的connectionLost通知其IProtocol连接丢失事件。因此,如果您想对该事件做出反应,您应该在协议上实现connectionLost(在这种情况下为ClientTelnetProtocol,它会出现吗?)并将您的应用程序逻辑放在该方法中。一旦ITransport实现知道连接已经丢失,就会调用此方法,因此它应该满足您的需求(请注意,它不是中断,因为Twisted是一个(很大程度上)单个 - 线程协作多任务系统;因此,如果您有阻止的应用程序代码(例如,clientsocket.connect)Twisted将不会调用任何的回调,直到完成并且反应器重新获得控制权。但只要有机会,它就会向处理程序(例如connectionLost)发送事件(例如连接丢失)。

我不明白为什么您的示例代码直接使用socket模块创建然后丢弃与目标地址的连接。我的猜测是你试图确定服务器是否接受连接。在这种情况下,您可能希望使用the ClientFactory method clientConnectionFailed来检测reactor.connectTCP尝试的连接是否失败,而不是使用socket模块并检查异常。您也可以使用Twisted's endpoint abstraction将此通知作为Deferred回调来代替。

您可能也对Tubes感兴趣,它提供了更高级别的数据流抽象。