【问题标题】:How to close connection after reactor.connectTCP in Twisted如何在 Twisted 中的 reactor.connectTCP 之后关闭连接
【发布时间】:2011-01-26 22:56:40
【问题描述】:

我想问一个关于如何在扭曲的RPC 中关闭连接的问题。
我知道有人问过类似的问题,但似乎没有回答我的问题。
我正在做一些基本的连接,如下图所示:

cfactory = pb.PBClientFactory()
reactor.connectTCP(<host>, <port>, cfactory)
dfr.addCallbacks(<callback>, <errfun>, ...)
...
(in the <callback> func)   remote.callRemote('myfunc', ...)

一切正常,可以满足我的需要。
但问题是,如果我检查它,我看到连接仍然处于活动状态(“已建立”) netstat -a.
由于我在无限期运行的客户端和服务器之间执行此操作,因此我不能只继续累积活动连接。
出于同样的原因,我也无法停止反应堆。
那么,有没有办法关闭连接,而不是通过创建自己的协议?
我想先检查一下,因为除了这个事实之外,一切都正常工作 - 如果可能的话,我将只添加一个需要的东西,而不是从协议设置和所有开始。
感谢您的关注,我们将不胜感激。
托尼

【问题讨论】:

    标签: twisted


    【解决方案1】:

    remoteRemoteReference。它有一个broker 属性,它是创建它的twisted.spread.pb.Broker 协议实例。与几乎所有协议一样,Broker 实例具有 transport 属性,该属性引用表示协议运行的连接的对象。

    因此,remote.broker.transport.loseConnection() 应该做你想做的事。

    还有其他选择。您可以在工厂捕获Broker 实例:

    class MyPBFactory(pb.PBClientFactory):
        def buildProtocol(self, addr):
            proto = pb.PBClientFactory.buildProtocol(self, addr)
            self.proto = proto
            return proto
    

    现在您在工厂中有一个proto 属性(但只有在实际建立连接之后,没有任何东西可以清理它,因此在连接丢失后它仍然存在 - 但您可以处理它) .

    【讨论】:

    • 非常感谢。这是一个非常及时和有用的答案。我尝试了第一种方法,它确实解决了我的问题。我想我不知道从远程实例到丢失连接方法的路径。现在我也知道在哪里可以进一步改进我的实施。与往常一样,您的回答是明确而中肯的。我真的很感激!
    • 我的荣幸。既然回答很有帮助,你能接受吗(点击旁边的复选框)? :)
    猜你喜欢
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-16
    相关资源
    最近更新 更多