【问题标题】:BufferedReader readLine detect closed socket and use .ready()BufferedReader readLine 检测关闭的套接字并使用 .ready()
【发布时间】:2013-10-06 18:20:59
【问题描述】:

服务器sn-p:

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

客户端sn-p:

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()) { 会返回空结果永远不会到达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
  }
}

【问题讨论】:

    标签: java sockets client-server bufferedreader readline


    【解决方案1】:

    只需删除 ready() 测试。它是如此简单。 ready() 不是流结束的测试。 readLine() 将在没有数据时阻塞。

    而且您必须在读取循环之外创建一次 BufferedReader。否则你会丢失数据。

    【讨论】:

    • 我不希望 readline 阻塞直到这是数据(在有数据之前不会执行进一步的代码),这就是我有 ready() 测试的原因。
    • 那么你永远无法检测到流的结尾。但是,由于您甚至没有针对“if reader.ready()”测试的“else”,因此不可能相信您的陈述。我想你误会了什么。
    【解决方案2】:

    我自己解决了这个问题,每 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2021-01-26
      • 2017-04-10
      • 2014-10-21
      • 1970-01-01
      • 2015-05-26
      • 1970-01-01
      相关资源
      最近更新 更多