2016-04-25 10 views
2

私はクライアント/サーバソケットでPythonスクリプトを作成しています。代替ソリューションを探した後、私のソリューションが正しいかどうかはわかりません。その解決策は、私のために動作しませんPython 3.5.1 - Asyncio - ソケットクライアントが切断されているかどうかを確認します

Python handling socket.error: [Errno 104] Connection reset by peer

Asyncio detecting disconnect hangs

が、私はそれが正しいか、きれいだ場合は、その次.I'mはわからないがあります

は、私はこれらの記事を読みました。

try: 
    # See if client has disconnected. 
    try: 
    data = (await asyncio.wait_for(client_reader.readline(),timeout=0.01)) 
    except ConnectionResetError, ConnectionAbortedError) as e: 
    break # Client disconnected 
except TimeoutError: 
    pass # Client hasn't disconnect 

私はConnectionResetErrorため以外を使用しない場合、私はクライアントを殺したときにデータがconnectionResetを発生させますので、私はエラーを取得します。

不規則なクライアント切断を検出するのは良い解決策ですか?

ps:クリーンアップされた言い回しと文法のためのプルーンありがとうございます。

答えて

0

ソケットとやり取りしていない限り、まだ接続されているかどうかはわかりません。切断を処理する適切な方法は、ソケットの状態をチェックするのではなく、そのようなエラーのために読み取りまたは書き込み操作が失敗したかどうかを確認することです。

通常、少なくともソケットでread()を待っていますが、これは切断を探す場所です。例外が発生すると、ストリームはクローズされたものとして検出され、例外をこのソケットの操作で待機している他のタスクに伝播します。つまり、あるストリームに対して並行操作がある場合は、この例外がどこにでも発生し、コード内のどこでも処理できることを期待する必要があります。

キャッチされた例外についてConnectionErrorをチェックするのが最適なソリューションです。これは接続に関連するすべての例外(ConnectionAbortedError、ConnectionResetErrorなど)の親クラスです。

関連する問題