使用asyncio实现一个简单的echo服务器

时间:2017-12-30 07:16:26

标签: python python-asyncio

我正在尝试使用asyncio实现一个简单的echo服务器。这是我的尝试:

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()

这启动了服务器,我可以从多个客户端连接,客户端也会将消息回显给它们。问题是当我关闭其中一个客户端时,回显消息也会停止出现在其他连接的客户端上。为什么会发生这种情况?如何防止这种情况发生?

1 个答案:

答案 0 :(得分:0)

服务器挂起,因为关闭连接时不会退出循环。惯例是当网络读取函数没有返回数据时,它意味着EOF。服务器必须处理它,例如:

while True:
    data = await reader.readline()
    if not data:
        break
    writer.write(data)

没有中断,循环会一次又一次地执行,因为EOF状态不会改变。

请注意,每个连接都由其自己的process处理,该String imagePath = downloadImageFile.getAbsolutePath(); Fragment2 obj_frament2 = new Fragment2(); Bundle bundle = new Bundle(); bundle.putString("image_path", imagePath); obj_frament2.setArguments(bundle); getFragmentManager().beginTransaction().add(R.id.container, obj_frament2).commit(); 使用读者和属于该连接的编写器进行调用。