从 asyncio StreamReader 读取
Reading from asyncio StreamReader
我正在尝试扩展使用流 reader/writer (code) 的 python asyncio HTTP 服务器示例。如果我理解正确,示例处理程序从 reader 读取 100 个字节并通过编写器将其回显给客户端。我正在尝试阅读超过 100 个字节...一直阅读到没有更多内容可读为止。
我试过让read()
函数尽可能多地读取,
data = yield from reader.read()
但这似乎会永远阻塞。所以我尝试读取块直到达到 EOF,
while not reader.at_eof():
data += yield from reader.read(100)
虽然这会检索更多数据,但它似乎会阻塞读取调用而不是退出 while 循环。
如何使用流 reader 从客户端获取完整消息?
您应该检查 StreamReader.read
是否返回了一个空字节对象来表示 EOF:
data = bytearray()
while True:
chunk = yield from reader.read(100)
if not chunk:
break
data += chunk
此外,如果您需要功能齐全的 HTTP 客户端,请考虑使用 aiohttp
。
在 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
像这样:
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): 读取 returns 空字节字符串
b''
在 EOF 上,因此请明确检查。
注意:如果您想一直读到从服务器传送的块的末尾,请查看
StreamReader.readchunk()
(虽然没有测试。)
我认为更好的方法是将条件放在 while 循环中,如下所示:
data = bytearray()
while not stream.at_eof():
chunk = yield from reader.read(1024)
data += chunk
我正在尝试扩展使用流 reader/writer (code) 的 python asyncio HTTP 服务器示例。如果我理解正确,示例处理程序从 reader 读取 100 个字节并通过编写器将其回显给客户端。我正在尝试阅读超过 100 个字节...一直阅读到没有更多内容可读为止。
我试过让read()
函数尽可能多地读取,
data = yield from reader.read()
但这似乎会永远阻塞。所以我尝试读取块直到达到 EOF,
while not reader.at_eof():
data += yield from reader.read(100)
虽然这会检索更多数据,但它似乎会阻塞读取调用而不是退出 while 循环。
如何使用流 reader 从客户端获取完整消息?
您应该检查 StreamReader.read
是否返回了一个空字节对象来表示 EOF:
data = bytearray()
while True:
chunk = yield from reader.read(100)
if not chunk:
break
data += chunk
此外,如果您需要功能齐全的 HTTP 客户端,请考虑使用 aiohttp
。
在 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
像这样:
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): 读取 returns 空字节字符串
b''
在 EOF 上,因此请明确检查。
注意:如果您想一直读到从服务器传送的块的末尾,请查看
StreamReader.readchunk()
(虽然没有测试。)
我认为更好的方法是将条件放在 while 循环中,如下所示:
data = bytearray()
while not stream.at_eof():
chunk = yield from reader.read(1024)
data += chunk