如何在Twisted中的reactor.connectTCP之后关闭连接

use*_*415 4 twisted

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

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

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

Jea*_*one 8

remote是一个RemoteReference.它有一个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
Run Code Online (Sandbox Code Playgroud)

现在你proto在工厂有了一个属性(但是只有在实际建立连接之后,没有任何东西可以清理它,所以在连接丢失后它仍然存在 - 但你可以照顾它).

  • 我的荣幸.既然答案很有帮助,你能接受吗(点击旁边的复选框)?:) (2认同)