2

socket.accept()からIOExceptionをキャッチし、acceptを実行しているスレッドをシャットダウンしているときにスタックしたトレースをダンプしないのはばかげていました...これを修正した後も、この呼び出しの状況に対処する方法を理解したいと思いますバーフ。

私のアプリは、数百、時には数千のクライアントを受け入れる古典的なソケットサーバーです。受け入れスレッドは常に稼働しており、accept()呼び出しでブロックされます。受け入れられると、別のスレッドが起動されて処理が実行されます。特にない。

問題は、accept()が失敗したときに何をすべきかということです。これはすぐに永続的な障害と見なされるべきですか?しばらくの間accept()に入るのを再試行して、通り抜けようとする必要がありますか?ベストプラクティスは何ですか?そして、IOExceptionがスローされる通常の理由は何ですか?

4

2 に答える 2

1
  1. 接続障害時に再試行するのはクライアントの責任です。サーバーは例外をログに記録し、「受け入れ」を続行する必要があります。一般に、サーバーはクライアントへの接続を開始しません。
  2. ファイアウォールの問題からファイルハンドルの枯渇の問題まで、IOExceptionがスローされる理由は多すぎます。IOExceptionのメッセージは、原因を明らかにするはずです。
于 2012-07-08T04:55:15.640 に答える
1

IOExceptionがaccept()呼び出しでスローされる理由として考えられるのは、ポートが使用されているか、ホストのネットワークが正しく構成されていないという問題だけです。

システムの管理者が問題に気づいて修正することを前提に、少し待ってから再試行することもできます。ただし、これが起動中に発生した場合は、アプリケーションが「致命的な」エラーメッセージでベイルアウトすることをお勧めします。

于 2012-07-08T05:50:54.380 に答える