如何在基于asyncio.protocol的类中揭示和使用接口方法(例如发送和RECV)



我已经进行了子分类的asyncio.Protocol来创建连接到某些服务器的TCP客户端。我想将下层接口与应用程序分开,并创建一个分层的体系结构,但是我不确定如何进行。

我遵循了正式文档中存在的TCP Echo客户端的示例,而我启动客户端的方式也非常相似:

loop = asyncio.get_event_loop()
coro = loop.create_connection(partial(MyClient, loop),
                              '127.0.0.1', 8888)
loop.run_until_complete(coro)
loop.run_forever()
loop.close()

但是,在我的协议中,我创建了两种方法(技术访问点,从技术上讲)为" N 1"层提供服务:

def setDataReceivedCallback(self, fun):
    self.dataReceivedIndication = fun
def send(self, msg):
    self.transport.write(msg)

n 1层将使用send方法将消息发送到服务器(请求),而setDataReceivedCallback将用于注册调用data_received时称为调用的回调(以便该协议可以发行协议n 1层的指示表明某些数据已经到达)。

但是,我不确定如何掌握这些入口点。更清楚:

  • create_connection需要一个返回协议实例的可呼叫:所以我将无法在该点掌握实例
  • loop似乎并没有暴露其运行的任何coroutines-此外,一旦我执行run_forever,我就失去了握住循环本身的能力

我在这里缺少什么?

lo和看,答案在于文档。从有关创建连接的部分中:

Note protocol_factory可以是任何类型的可呼叫,不一定是 班级。例如,如果要使用预先创建的协议 实例,您可以通过lambda:my_protocol。

将代码转换为代码表示以下内容:

loop = asyncio.get_event_loop()
ThisClient = MyClient(loop)
ThisClient.setDataReceivedCallback(whateverFunction)
# And you can also use and pass around ThisClient.send at this point
coro = loop.create_connection(lambda: ThisClient,
                              '127.0.0.1', 8888)
loop.run_until_complete(coro)
loop.run_forever()
loop.close()

最新更新