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

问题:

当客户端向服务器写入内容时,它会被正确读取,但是当客户端关闭它的套接字时(例如强制退出程序),reader.readLine()应该输出null,因为if (reader.ready()) {null 结果永远不会到达quit()。如果我离开if (reader.ready()) {,服务器将无法读取数据。

我该如何解决?

编辑:我不能使用 awhile ((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 回答