1

基本的に、私はサーバー クラスとクライアント クラスを持っています。クライアントはソケットを作成し、入力したものをサーバーに送信します。これは、既存のすべてのクライアントからのソケットのベクトルの出力ストリームに書き込まれます。チャット クライアントを閉じた場合を除き、正常に機能します。その後、送信された次のメッセージで次の例外が発生します。

java.net.SocketException: Software caused connection abort: socket write error

クライアントによって閉じられたソケットがサーバーのソケットのベクトルでソケットを閉じていないか、閉じられていてもベクトルに残り、閉じられたソケットに書き込もうとしていると思います。これは何が起こっているように聞こえますか?接続先のソケットに関して socket.close() メソッドが何をするのか正確にはわかりません。

4

3 に答える 3

1

クライアント側でソケットを閉じますが、サーバー側では閉じていないため、この例外が発生します。

正常に閉じるには、サーバー側のソケットを閉じる CLOSE メッセージをクライアントから送信する必要があります。

クライアントのソケットが閉じられた場合は、サーバー側で例外を処理する必要があります。たとえば、ソケットのベクトルから例外を削除します。

于 2012-11-27T22:37:12.527 に答える
0

クライアントがソケットを閉じた場合、サーバーで EOS を読み取る (read()リターン -1、readLine()リターンnull、その他の X の場合はreadXXX()throws ) か、おそらく最初の書き込みではなく、書き込み時に を取得します。これらのいずれかが発生した場合は、サーバーのソケットを閉じて、そのクライアントのことをすべて忘れる必要があります。EOFExceptionIOException: connection reset by peer

于 2012-11-27T23:44:02.193 に答える
-1

両側のつながりが手で繋がれているわけではないと思うし、離せば必ず感じてしまう。この問題を解決するには、送信前にソケットが閉じているかどうかを確認し、例外をキャッチします。

于 2012-11-27T22:37:19.297 に答える