2017-12-30 25 views
2

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

이렇게하면 서버가 시작되고 여러 클라이언트에서 연결할 수 있으며 클라이언트에게 메시지가 다시 표시됩니다. 문제는 내가 클라이언트 중 하나를 닫을 때, 에코 메시지가 다른 연결된 클라이언트에도 나타나지 않는 것입니다. 왜 그런 일이 일어나고 어떻게 막을 수 있습니까?

답변

0

연결이 닫힐 때 루프가 종료되지 않으므로 서버가 중지됩니다. 규칙은 네트워크 읽기 함수가 데이터를 반환하지 않을 때, 즉 EOF를 의미합니다. 서버에서 처리해야합니다 (예 :

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

중단하지 않고 EOF 상태가 변경되지 않기 때문에 반복적으로 루프가 실행됩니다.

각 연결은 해당 연결에 속한 판독기와 작성기로 호출되는 자체 process에 의해 처리됩니다.

+0

감사합니다. 나는 모든 네트워킹 코드에이 코드 조각을 가지고있다. 처음에는 asyncio를 사용하여 잊어 버렸다. – Ravi