Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BufferedReader读取线检测关闭的套接字并使用.ready()_Java_Sockets_Client Server_Bufferedreader_Readline - Fatal编程技术网

Java BufferedReader读取线检测关闭的套接字并使用.ready()

Java BufferedReader读取线检测关闭的套接字并使用.ready(),java,sockets,client-server,bufferedreader,readline,Java,Sockets,Client Server,Bufferedreader,Readline,服务器代码段: reader = new BufferedReader(new InputStreamReader(new BufferedInputStream(connection.getInputStream()))); if (reader.ready()) { result = reader.readLine(); if (result == null) { quit(); // handle closing the socket } else

服务器代码段:

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()){
空结果永远不会到达
quit()
。 如果我不使用
if(reader.ready()){
,服务器将无法读取数据

我该如何解决这个问题

编辑:我不能在((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
  }
}
只需删除ready()测试。就这么简单。ready()不是流结束测试。readLine()将在没有数据时阻塞


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

我通过每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
}

我不希望readline在这是数据之前阻塞(在有数据之前不会执行进一步的代码),这就是为什么我有
ready()
测试。这样,您就永远无法检测到流的结尾。但因为您甚至没有“if reader.ready”()的“else”我不可能相信你的话,我想你误解了什么。