クライアントからの HTTP GET リクエストを処理する Java サーブレットがあります。リクエストを処理した後、HTTP 200 OK を返し、レスポンスには数百バイトのデータが含まれます。
応答が送信されるのとほぼ同時にクライアントがネットワークから切断される特定のエラー状態があります。データはサーブレットによって出力ストリームに書き込まれ、出力ストリームがフラッシュされます。タイミングは、出力ストリームがフラッシュされた時点で、サーバーはクライアントが接続されていないことを認識していません。(クライアントとサーバーの間のポイントによって接続が突然切断されたため、クライアントは TCP 接続を適切に閉じる機会がありません。サーバーは TCP RST を認識しません。)
問題は、サーブレットがこの状態を検出する方法があるかどうかです。私はすでに2つのことを確認しました:
- サーブレットで例外がスローされません。この状態で IOException が発生することを期待していましたが、発生していないようです。
- クライアントへの書き込みに使用されている PrintWriter で PrintWriter.checkError() を呼び出すと、このエラー状態が発生した場合でも false (エラーなし) が返されます。
したがって、私が知る限り、サーバーがこれを知る方法はありません。しかし、クライアントの TCP スタックからの確認応答がないことに基づいて、それが可能であるように思えます。しかし、おそらくこれはサーブレットに公開されていません。
問題があるかどうかはわかりませんが、Tomcat 7.0.26 を使用しています。