使用 asyncio 实现一个简单的回显服务器
Implement a simple echo server using asyncio
我正在尝试使用 asyncio 实现一个简单的回显服务器。这是我的尝试:
import asyncio
async def process(reader, writer):
while True:
data = await reader.readline()
writer.write(data)
loop = asyncio.get_event_loop()
listener = asyncio.start_server(process, host=None, port=2500)
loop.run_until_complete(listener)
loop.run_forever()
这会启动服务器,我可以从多个客户端进行连接,客户端的消息也会回显给他们。问题是当我关闭其中一个客户端时,回显消息也停止出现在其他连接的客户端上。为什么会发生这种情况,我该如何预防?
服务器挂起,因为连接关闭时没有退出循环。惯例是当一个网络读取函数returns没有数据时,就意味着EOF。服务器必须处理它,例如:
while True:
data = await reader.readline()
if not data:
break
writer.write(data)
没有 break 循环会一次又一次地执行,因为 EOF 状态不会改变。
请注意,每个连接都由它自己的 process
处理,它通过 reader 和属于该连接的编写器调用。
我正在尝试使用 asyncio 实现一个简单的回显服务器。这是我的尝试:
import asyncio
async def process(reader, writer):
while True:
data = await reader.readline()
writer.write(data)
loop = asyncio.get_event_loop()
listener = asyncio.start_server(process, host=None, port=2500)
loop.run_until_complete(listener)
loop.run_forever()
这会启动服务器,我可以从多个客户端进行连接,客户端的消息也会回显给他们。问题是当我关闭其中一个客户端时,回显消息也停止出现在其他连接的客户端上。为什么会发生这种情况,我该如何预防?
服务器挂起,因为连接关闭时没有退出循环。惯例是当一个网络读取函数returns没有数据时,就意味着EOF。服务器必须处理它,例如:
while True:
data = await reader.readline()
if not data:
break
writer.write(data)
没有 break 循环会一次又一次地执行,因为 EOF 状态不会改变。
请注意,每个连接都由它自己的 process
处理,它通过 reader 和属于该连接的编写器调用。