2014-11-21 157 views
1

在Python 3.4/Asyncio我正在使用StreamReader/Writer。Python .readline()重置

要檢測客戶端斷開連接,常見的方法似乎是從客戶端讀取,如果沒有任何內容,則客戶端斷開連接。

while True: 
    data = (yield from asyncio.wait_for(client_reader.readline(), 
            timeout=1.0)) 
    if not data: #client disconnected 
     break 

但是你很快用完行從客戶端頭(它移動到每個循環的下一行),如果有從客戶端發送不需要額外的線(在我的情況下,客戶是不讀發送只是在聽)你打了超時。

我想要做的只是重複讀取頭部的第一行......或者甚至可能只是第一行的第一個字符,或者當它到達最後一個循環時不可能回到第一位。

什麼是最好/最優雅的方式來完成這項任務? 3.4/ASYNCIO /的StreamReader /作家。 (檢測客戶端斷開連接)

+0

我認爲問題不是asyncio特定的,可能需要更改客戶端代碼。 你喜歡如何解決它「一般」,沒有asyncio? – 2014-11-23 10:41:38

回答

0

我有類似的問題。對我來說工作的方式是首先檢查EOF,然後如果爲true,則引發ConnectionError異常。因此,對於您的代碼,我會添加以下內容:

while True: 

    try: 
     if client_reader.at_eof(): 
      raise ConnectionError 

     data = (yield from asyncio.wait_for(client_reader.readline(), 
             timeout=1.0)) 
     if not data: #client disconnected 
      break 

    except ConnectionError: 
     break 

    except: 
     break # This is here to catch things like the asyncio futures timeout exception 

希望有所幫助。如果有人有更好的方式,我會感興趣。