【问题标题】:Checking if a connection was closed with Twisted检查连接是否已使用 Twisted 关闭
【发布时间】:2017-12-01 07:00:10
【问题描述】:

我正在使用 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() 上,或者如果可能,在服务器关闭与代理的连接时设置中断,并让代理立即关闭与客户端的连接。

【问题讨论】:

    标签: python twisted twisted.internet


    【解决方案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 感兴趣,它提供了更高级别的数据流抽象。

    【讨论】:

    • 谢谢,这正是我想要做的,但我找不到 clientConnectionFailed 方法,所以我使用了一个便宜的解决方法,我想只设置一个套接字并先尝试连接,如果连接失败,就中止连接。
    猜你喜欢
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多