您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何通过工厂使用扭曲协议发送数据

如何通过工厂使用扭曲协议发送数据

您可以访问所需的所有对象。工厂负责创建协议实例,因此,如果要将协议实例保留在工厂可以使用的位置,请覆盖buildProtocol并保存该实例:

class MyFactory(ClientFactory):
    protocol = MyProtocol

    ...

    def buildProtocol(self, address):
        proto = ClientFactory.buildProtocol(self, address)
        self.connectedProtocol = proto
        return proto

但是,这种方法缺少一个重要功能。很难说出何时buildProtocol调用connectedProtocol已设置。如果尝试天真使用此属性

factory = MyFactory()
reactor.connectTCP(host, port, factory)
factory.connectedProtocol.send_message(...)

代码将失败并显示AttributeError因为尚未实际建立连接。由于Twisted是事件驱动的,因此您需要通过响应表示已建立连接的事件来确保使用此代码

您可以通过在构造协议时触发回调来完成此操作,而不仅仅是设置属性。Twisted实际上有一个帮助工厂,它已经做了这样的事情:

from twisted.internet.protocol import ClientCreator

cc = ClientCreator(reactor, MyProtocol)
whenConnected = cc.connectTCP(host, port)

# Or the equivalent with endpoints
#  from twisted.internet.endpoints import TCP4ClientEndpoint
#  from twisted.internet.protocol import ClientFactory
#  endpoint = TCP4ClientEndpoint(reactor, host, port)
#  factory = ClientFactory()
#  factory.protocol = MyProtocol
#  whenConnected = endpoint.connect(factory)

def cbConnected(connectedProtocol):
    connectedProtocol.send_message(...)

def ebConnectError(reason):
    # Connection attempt Failed, perhaps retry
    ...

whenConnected.addCallbacks(cbConnected, ebConnectError)

你也可以保存在参考connectedProtocolcbConnected回调,这样就可以在以后继续使用它。您还可以在中开始任何其他要使用连接的协议的操作cbConnected,以便他们在实际可用之前不要尝试使用连接。

其他 2022/1/1 18:43:46 有446人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶