使用 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 和属于该连接的编写器调用。