Java Socket IO流关闭问题: Exception in thread "main" java.net.SocketException: Socket is closed

发布时间 2023-09-05 17:18:30作者: Ahci

先说结论

问题: 明明执行的语句在socket.close前, 却出现Exception in thread "main" java.net.SocketException: Socket is closed报错
结论: 在Java中关闭一个包装流会导致它的底层流也被关闭所以一般使用socket.shutdownOutput()socket.shutdownInput()关闭对应的流

问题复现

最近在学习Socket, 做了一个"Client发送文件名, Server回复文件"的Demo, 并编写了一个将InpuStream转为String的工具类, 代码如下:

public static String streamToString(InputStream is) throws IOException {
      BufferedReader reader = new BufferedReader(new InputStreamReader(is));
      StringBuilder stringBuilder = new StringBuilder();
      String line;
      while ((line = reader.readLine()) != null) {
          stringBuilder.append(line);
      }
      reader.close();  /* 罪魁祸首 */
      return stringBuilder.toString();
  }

在执行Server时, 收到Client传来的文件名(使用上面提到的工具类获取)后, 再次调用socket.getOutputStream()出现了Socket is closed异常;

经过排查发现是在工具类中直接将BufferedReader关闭了, 由于BufferedReader是一个包装流, 导致关闭它时它的底层流也会被关闭, 就出现了Socket is closed异常.