我已经进行了子分类的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()