12

私はBufferedReader.readLine()メソッドを使用してリモートサーバーからの応答を読み取ります(これはCで記述されており、ソースコードにアクセスできません)。

BufferedReader br = new BufferedReader(new InputStreamReader(in));
String line;
while((line = br.readLine())!=null){
    [...]
}

ただし、タイムアウトになるまで、常に最後の行でブロックされます。だから私は次のコードを使用しました:

int b;
while(true){
   b = in.read;
   [...]
}

そして、最後に読み取られたバイトの整数値が13であることがわかりました。これは、キャリッジリターンだと思います。

では、なぜreadLineメソッドがブロックするのでしょうか。サーバーは通常、ストリームの終わりに到達したことをどのように通知しますか?ありがとう。

4

4 に答える 4

12

ネットワーク接続の場合、ソケットが閉じられるとストリームが終了します。

したがってreadLine()、「行末」を受信するか、手動で接続を閉じるまでブロックするのは完全に正常です。readLine()'13'値の最後の文字を受け取ると、その行が読み取られ、ループが再開されて次の行を待ちます。

「最後の行」と他の行に違いはありません。

ループを停止するには、どこかで手動で接続を閉じるか、タイムアウトを待つ必要があります。しかし、通信プロトコルに関する詳細情報がなければ、これについてより正確にすることは不可能です。

于 2011-05-26T14:10:20.040 に答える
4

プロトコルによって異なります。サーバーがストリームを閉じない場合、適切な行末が受信されるまでreadLineはブロックされます。したがって、サーバーが適切な回線終了を送信しない場合は、ブロックされます。より低レベルのメソッドを使用して、プロトコルドキュメントを取得するか、リバースエンジニアリングする必要があります。

于 2011-05-26T14:09:31.187 に答える
2

サーバーコードにout.print()ではなくout.println()があることを確認してください

于 2013-10-23T09:22:34.107 に答える
0

空の行を使用しない場合は、while条件を拡張できます。

while((line = br.readLine())!=null && line.length() > 0) {
   // ...
}
于 2014-01-03T16:44:50.967 に答える