从asyncio StreamReader

时间:2016-02-04 19:01:53

标签: python http server python-asyncio

我正在尝试扩展使用流式读写器(code)的python asyncio HTTP服务器示例。如果我理解正确,示例处理程序从阅读器读取100个字节,并通过编写器将其回送给客户端。我试图读取超过100个字节...读取,直到没有什么比阅读更好了。

我试过让read()函数尽可能多地读取,

data = yield from reader.read()

但这似乎永远阻止了。所以我尝试读取块直到达到EOF,

while not reader.at_eof():
    data += yield from reader.read(100)

虽然这会检索更多数据,但它似乎会阻止读取调用而不是退出while循环。

如何使用流阅读器从客户端获取整个消息?

3 个答案:

答案 0 :(得分:2)

像这样:

empty_bytes = b''
result = empty_bytes

while True:
    chunk = await response.content.read(8)

    if chunk == empty_bytes:
        break

    result += chunk

确定使用EOF

if chunk == empty_bytes:

代替

if not chunk:

查看文档(aiohttp): read 返回一个空字节字符串

b''
关于EOF的

,请明确检查。

注意:如果您希望阅读直到从服务器发送的块结尾,请结帐

StreamReader.readchunk()

(但是没有对它进行测试。)

答案 1 :(得分:1)

您应该检查StreamReader.read是否返回空字节对象以发出EOF信号:

data = bytearray()
while True:
    chunk = yield from reader.read(100)
    if not chunk:
        break
    data += chunk

另外,如果您需要功能齐全的HTTP客户端,请考虑使用aiohttp

答案 2 :(得分:-2)

在at_eof之前使用feed_eof。

request_text = b''
while True:
    request_text += yield from self.reader.read(1024)
    self.reader.feed_eof()
    if self.reader.at_eof():
        break