2016-12-31 7 views
0

タイトルによれば、ソケット接続を閉じるには、mySocket.close()と呼ぶだけで十分ですか?反対側には何が起こるでしょうか?Socket.close()は接続を終了するためのきれいな方法と考えられていますか?

また、行く方法でなければ、何ですか?ソケットを介して何らかの "仕上げ"メッセージを送信しなければならないので、もう一方の側もそれを終了すべきであると知っていますか?

ボーナス質問:Javaのドキュメンテーションも、ソケットの入力ストリームとOutputStreamを閉じます。このソケットを閉じる

言います。

ソケットを単独で閉じるか、ストリームを明示的に閉じる必要がありますか(もちろん、私はtry-with-resourcesを使用していないと仮定します)。

答えて

3

ソケットを閉じると、相手側では何もしません。リモートホストは、接続が閉じられたことを知らないでしょう。 接続が閉じているかどうかをチェックする唯一の方法は、入出力ストリームを読み書きしようとすることです。 -1InputStream#read()メソッドによって返された場合、第2の側は、第1の側が接続を閉じたことを知っています。スローされたIOExceptionはまた、閉じた接続を示します。

通常、入出力ストリームは、Socket#close()を呼び出すときに閉じられるため、閉じる必要はありません。 Socket#close()は、接続を閉じるために必要な唯一のものです。

ラッパーストリーム(例:BufferdInputStream/BufferedOutputStream)を使用している場合は、これらのラッパーストリームを明示的に閉じて、これらのラッパーストリームで使用されるリソース(バイトバッファ配列など)を解放する必要があります。ラッパーを閉じるとラップされたストリームが閉じられ、ラップされたストリームのラップされたストリームも閉じられるため、トップレベルのラッパーストリームのみを閉じる必要があります。それで...

+0

これは間違いなく私のボーナスの質問に答えてくれてありがとうございます。しかし、私の主な質問には答えません。 – NPS

+0

私の編集アンワーを見てください。 –

+0

要約: 'Socket.close()' ** **はきれいな方法ですが、私はもう一方の側のものを扱う必要があります( '-1'を確認する/例外とハンドル'Socket.close()'も同様に呼び出します)。ストリームラッパーを使用している場合は、最初に明示的にクローズする必要があります。あれは正しいですか? – NPS

0

Socket.close()は、接続を閉じるためのきれいな方法です。これにより、TCP FINパケットがピアに送信され、通常のTCPシャットダウンシーケンスが開始されます。それはまた、ソケットのInputStreamとOutputStreamを閉じます、私はその点のドキュメントに曖昧さはありません。

+0

ドキュメントでは明示的に述べていますが、同時にストリームラッパーを手動で閉じたサンプルコードも見ていました。 J.Tenniéの答えがなぜそれであるかが分かり、私がここで欠けていたものです。だから私はボーナスの質問をしました。 – NPS

関連する問題