2012-01-17 12 views
18

を閉じると、誰かがJavaソケットに次の動作を説明することができます:動作時に出力ストリーム

一般的な考えはこれです:

  1. オープンソケット、取得するI/Oストリーム。
  2. 書き込み要求は、ストリーム
  3. 閉じるソケット閉じるストリーム
  4. 読む応答を、アウト閉じます。

ここに私の質問/問題です。

出力にPrintWriterを使用し、それを閉じると、ソケット全体が閉じられ、後続の読み取り操作が悲惨に失敗します。

代わりに、ソケットのshutdownOutput()メソッドを直接使用すると、ソケットを有効にしたまま出力ストリームチャネルを正しく閉じます。

PrintWriterオブジェクトを閉じると、ソケット全体が閉じられるのはなぜですか? PrintWriterclose()方法は、階層を遡っと同様SocketOutputStreamclose()メソッドを呼び出して呼び出しているため

+1

閉じる前にフラッシュする必要があるかもしれません。 –

+1

問題が解決しない場合は、プリントライターを閉じる前に、接続で.flush()を使ってフラッシュしてみましたか? – vcetinick

答えて

26

これはあなたのコードがどのように見えるかことがありますのは、ソケットのgetOutputStream()方法の説明を見てみましょう、

Socket socket; 
PrintWriter pw = new PrintWriter(socket.getOutputStream()); 
pw.close(); 

getOutputStream

public OutputStream getOutputStream() throws IOException

このソケットの出力ストリームを返します。 このソケットに関連付けられたチャネルがある場合、出力ストリームはすべての操作をチャネルに委譲します。チャネルが非ブロックモードの場合、出力ストリームの書き込み操作はIllegalBlockingModeExceptionをスローします。

返されたOutputStreamを閉じると、関連するソケットが閉じられます。

戻り値:

このソケットにバイトを書き込むための出力ストリーム。

例外:

IOExceptionが - 出力ストリームを作成する場合、またはソケットが接続されていない場合、I/Oエラーが発生した場合。

上記の説明からわかるように、返されたOutputStreamを閉じると、関連付けられたソケットが閉じられます。

PrintWriterを閉じると、対応するソケットを閉じる関連するOutputStreamが閉じられます。

+4

RTFMええ? :) 徹底的に説明していると思います。 –

+0

@Alanmarsそのような状況を避ける方法。 OutputStreamを閉じた後でもソケットを開いたままにしたい場合はどうすればいいですか?これを行う方法はありますか? –

2

は、それはおそらくです。 SocketOutputStreamclose()メソッドの一部として、Socketclose()メソッドも呼び出すため、SocketInputStreamも閉じます。 shutdownOutput()関数を呼び出す代わりに、以前に書き込まれたデータの後にTCPの通常の接続終了シーケンスが続きます。次に、出力ストリームを無効にします。

関連する問題