2017-12-30 14 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() 

これはサーバーを起動するので、複数のクライアントから接続できます。また、クライアントにメッセージが返されます。問題は、クライアントの1つを閉じると、エコーメッセージが他の接続されたクライアントにも表示されなくなることです。なぜそれが起こり、どうすればそれを防ぐことができますか?接続が閉じられたときにループが終了されていないため

答えて

0

サーバがハング。規約は、ネットワーク読み取り関数がデータを返さない場合、つまりEOFを意味します。 EOF状態は変更されませんので、サーバーは、例えば、それを処理しなければなりません。:休憩なし

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

をループは、何度も何度も実行されます。

は、各接続がリーダーとその接続に属するライタと呼ばれる独自の processによって処理されることに注意してください。

+0

ありがとうございました。私はすべてのネットワーキングコードにこのコードを書いています。初めてasyncioを実行して、それを忘れてしまいました。 – Ravi

関連する問題