1

サーバー スニペット:

reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(connection.getInputStream())));
if (reader.ready()) {
    result = reader.readLine();
    if (result == null) {
         quit(); // handle closing the socket
    } else {
         // process result
    }
}

クライアント スニペット:

BufferedOutputStream os = new BufferedOutputStream(connection.getOutputStream());
OutputStreamWriter osw = new OutputStreamWriter(os, "US-ASCII");
osw.write("hello\n");
osw.flush();

問題:

クライアントがサーバーに何かを書き込むと、それは正しく読み取られますが、クライアントがソケットを閉じると (たとえば、プログラムを強制終了する)、null の結果が に到達しないため、はreader.readLine()を出力する必要があります。を放置すると、サーバーはデータを読み取ることができません。nullif (reader.ready()) {quit()if (reader.ready()) {

これを修正するにはどうすればよいですか?

編集:次のwhile ((result = reader.readLine()) != null) {ように、その後さらにコードを実行する必要があるため、使用できません:

while (running) {
  try {
    reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(connection.getInputStream())));
    if (reader.ready()) {
      result = reader.readLine();
      if (result == null) quit();
      else // process result
    }
    catch (Exception e) { ... }

    // more code
  }
}
4

2 に答える 2

0

このコードを5秒ごとに実行して、自分で解決しました:

try {
          BufferedOutputStream os = new BufferedOutputStream(thread_cnn.getOutputStream());
          OutputStreamWriter osw = new OutputStreamWriter(os, "US-ASCII");
          osw.write("areyoustillthere\n");
          osw.flush();

} catch (Exception e) { 
           quit(); // handle quit if server can't reach client
}
于 2013-10-08T16:08:13.133 に答える
0

ready() テストを削除するだけです。それはそれと同じくらい簡単です。ready() は、ストリームの終わりのテストではありません。readLine() は、データがない間ブロックします。

また、読み取りループの外で BufferedReader を一度作成する必要があります。そうしないと、データが失われます。

于 2013-10-06T19:01:23.060 に答える