人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

JAVA の input output をクローズするタイミングについて。

すいません、in out についての質問なんですが、
============================
public class player_receive extends Thread {

private int size;
private String msg;
private Socket socket;
byte[] w=new byte[10240];

public String getplayer_receive(){
return msg;
}

public player_receive(Socket socket) {
this.socket=socket;
}

public void run(){

while( true ){

try {

java.io.InputStream in = socket.getInputStream();
size=in.read(w);
msg=new String(w,0,size,"UTF8");
// in.close();

if ( msg != null ) {
break;
}

} catch (IOException e) {
}

}

}

}
============================
上のようなあるソケットから文字列を受け取るスレッドを作りました。

getplayer_receive()
を使って文字列をうけとるやつで
// in.close();
をコメントアウトしています。これだとうまくいきます。

in.close();

のコメントを外すと止まります。

うけとったときに msg に格納しているのでinは不要だと思うのですが、なぜでしょうか?

inをずっとクローズせずに、このスレッドをどんどん量産していった場合、どうなるでしょうか?

●質問者: zachouR
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● うぃんど

クローズすべきは接続部分なのでin.close()ではなくsocket.close()


2 ● kenichiice

のコメントを外すと止まります。


Socket#getInputStream() の説明

http://docs.oracle.com/javase/jp/7/api/java/net/Socket.html#getInputStream%28%29

に、「返されたInputStream をクローズすると、関連付けられたソケットがクローズします。」とあります。

従って、ご提示のコードで「in.close();」を生かすとそこでsocketオブジェクトがクローズされ、それにより次の「java.io.InputStream in = socket.getInputStream();」の所でIOExceptionが投げられ、無限ループしてしまうのではないでしょうか。

inをずっとクローズせずに、このスレッドをどんどん量産していった場合、どうなるでしょうか?


inはクローズしなくても問題ないように見えますが、socketは適切なタイミングでクローズする必要があると思います。

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ