2013-03-20 3 views
5

メッセージを送信するときに.flushを使用してメッセージの末尾に「\ n」を入れても、メッセージを読み込むwhileループがブロックされます。 ソケット接続を閉じるときのみ、ループを終了します。 whileループBufferedReader readLine()ブロック

BufferedInputStream is; 
BufferedOutputStream os; 

is = new BufferedInputStream(connection.getInputStream()); 
os = new BufferedOutputStream(connection.getOutputStream()); 

isr = new InputStreamReader(is); 

String query= ""; 
String line; 

while((line = br.readLine()) != null){ 
    query+= line; 
} 

String response = executeMyQuery(query); 
osw = new OutputStreamWriter(os, "UTF-8"); 

osw.write(returnCode + "\n"); 
osw.flush(); 

サーバーで私のコードブロック:

bos = new BufferedOutputStream(socket. 
      getOutputStream()); 
bis = new BufferedInputStream(socket. 
      getInputStream()); 
osw = new OutputStreamWriter(bos, "UTF-8"); 
osw.write(REG_CMD + "\n"); 
osw.flush(); 

isr = new InputStreamReader(bis, "UTF-8"); 
BufferedReader br = new BufferedReader(isr); 

String response = ""; 
String line; 

while((line = br.readLine()) != null){ 
    response += line; 
} 

とサーバーのコード:ここで

は、クライアントコードです。おかげさまで

+0

try/catchブロックにコードを入れ、finallyブロックでストリーム/接続を閉じます。 – happy

+1

これには疑問がないようです。この現象がなぜ発生するのか知りたいですか?それを防ぐ方法は? – Sinkingpoint

+1

whileループを使用する理由を1行だけ読みたい場合は? –

答えて

10

BufferedReaderは、ファイルの終わり(ファイルの終わりまたはストリームまたはソースなど)に達するまで、入力の読み取りを続けます。この場合、 'end'はソケットのクローズです。したがって、ソケット接続が開いている限り、ループは実行され、BufferedReaderは入力が増えるのを待って、 '\ n'に達するたびにループします。

+0

mmm私は終わりがソケットの閉鎖だとは思わなかった。ありがとう。今私はそれを見て、私は文書を誤解しました! – Majid

+0

ファイル以外のストリームのeofについては、docはむしろあいまいです。 – Sinkingpoint

+0

BufferedReaderではなく、EOSまで読み取りを継続するのはOPのループです。 – EJP

3

これは、whileループ内の条件は次のとおりです。while((line = br.readLine()) != null)

あなたは各反復上のラインを読んでのreadLineはnullを返した場合ループをLEVE。

readLineは、eofに達した場合にのみnullを返します(= sockedは閉じています)。 '\ n'が読み取られた場合はStringを返します。

あなたがのreadLine上のループを終了する場合は、あなただけ行う全体whileループウントを省略することができます。

line = br.readLine()

+0

ありがとう、私はこれを試してみることがあります。 – Majid

0

あなたはせずにソケットに何を取得したい場合は、それを閉じることを余儀なくされています単にのObjectInputStreamおよびObjectOutputStreamのを使用。..

例:

ObjectInputStream ois; 
ObjectOutputStream oos; 

ois = new ObjectInputStream(connection.getInputStream()); 

String dataIn = ois.readUTF(); //or dataIn = (String)ois.readObject(); 

oos = new ObjectOutputStream(connection.getOutputStream()); 
oos.writeUtf("some message"); //or use oos.writeObject("some message"); 
oos.flush(); 

..... 
0

これは、InputStreamが赤色になる準備ができていないため、in.readLine()でブロックされるためです。 はこれを試してください:もちろん

boolean exitCondition= false; 

while(!exitCondition){ 
    if(in.ready()){ 
     if((line=in.readLine())!=null){ 
      // do whatever you like with the line 
     } 
    } 
} 

をあなたがexitConditionを制御する必要があります。

その他のオプションは、非同期(非ブロッキング)の読み取りを可能にするnioパッケージの使用ですが、必要に応じて異なります。

0

私は、ソリューションの多くを試みたが、実行をブロックしていなかった私が見つけただけでした:

BufferedReader inStream = new BufferedReader(new 
InputStreamReader(yourInputStream)); 
String line; 
while(inStream.ready() && (line = inStream.readLine()) != null) { 
    System.out.println(line); 
} 

inStream.ready()リターンはfalseを次readLine()呼び出しが実行をブロックするかどうか。

関連する問題