2017-02-17 64 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()