【问题标题】:Python .readline() resetPython .readline() 重置
【发布时间】:2015-05-10 07:29:14
【问题描述】:

在 Python 3.4/Asyncio 中,我使用的是 StreamReader/Writer。

检测客户端断开连接的常用方法似乎是从客户端读取,如果那里什么都没有,则客户端断开连接。

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

但是,您很快就用完了从客户端标头中读取的行(它移动到每个循环的下一行),并且如果没有从客户端发送其他行(在我的情况下,客户端不只是发送侦听)你达到了超时。

我想做的只是一遍又一遍地读取标题的第一行..或者甚至可能只是第一行的第一个字符,或者当它到达最后一行循环返回时这是不可能的绕到第一。

完成这项任务的最佳/最优雅的方式是什么? 3.4/Asyncio/StreamReader/Writer。 (检测客户端断开连接)

【问题讨论】:

  • 我认为问题不是 asyncio 特定的,可能需要更改客户端代码。在没有 asyncio 的情况下,您“一般”如何解决它?

标签: python python-3.x python-asyncio


【解决方案1】:

我遇到了类似的问题。对我有用的方法是首先检查 EOF,然后如果为真则引发 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-28
    • 2018-06-16
    • 2016-11-07
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 2012-02-15
    相关资源
    最近更新 更多