2017-02-17 42 views
0

的类中公开和使用接口方法(例如send和recv)我已经将子类型asyncio.Protocol创建为连接到某个服务器的TCP客户端。 我想从应用程序分开较低级别的接口,并创建一个分层体系结构,但我不确定如何继续。如何在基于asyncio.Protocol

我跟着TCP Echo Client present on the official documentation的例子,我开始在客户端的方式也很相似:

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) 

send方法将由N + 1层中使用,以将消息发送到所述服务器(请求),而setDataReceivedCallback将用于注册回调即所谓012时调用(以便协议可以向N + 1层发出某些数据已到达的指示)。

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

  • create_connection需要返回一个协议实例可以调用的:所以我将无法得到该实例的保持在该点
  • loop似乎没有公开任何协同程序它运行 - 此外,一旦我执行run_forever我失去了获得循环本身的能力

我在这里失踪了什么?

回答

0

瞧,答案在于文件。 从部分上Creating Connections

注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()