2014-11-21 132 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 

希望有所帮助。如果有人有更好的方式,我会感兴趣。