13

readLine() を使用してデータを受信する場合、メッセージの送信時に .flush を使用してメッセージの最後に「\n」を挿入しても、メッセージを読み取る while ループがブロックされます。ソケット接続を閉じるときにのみ、ループを離れます。

クライアントコードは次のとおりです。

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;
}

およびサーバーのコード:

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();

私のコードはループ中にサーバーでブロックされます。ありがとう。

4

7 に答える 7

20

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

于 2013-03-20T10:49:40.200 に答える
3

これは、while ループの条件によるものです。while((line = br.readLine()) != null)

反復ごとに 1 行読み取り、readLine が返された場合はループを終了しますnull

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

readLine でループを終了したい場合は、while ループ全体を省略して、次のようにします。

line = br.readLine()

于 2013-03-20T10:49:42.100 に答える
1

これは、 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 パッケージを使用することもできます。これにより、非同期 (ブロックではなく) 読み取りが可能になりますが、必要に応じて異なります。

于 2016-12-02T23:02:57.147 に答える