すいません、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をずっとクローズせずに、このスレッドをどんどん量産していった場合、どうなるでしょうか?
のコメントを外すと止まります。
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件)