【问题标题】:Socket being closed by try with resources通过尝试使用资源关闭套接字
【发布时间】:2012-10-09 09:46:39
【问题描述】:

我正在尝试编写一些具有以下基本形式的简单套接字代码 -

try(BufferedReader request = new BufferedReader(new InputStreamReader(sock.getInputStream()))){
//Do some work...
}
//BufferedReader gets closed, but also makes the socket close
...
...
response.write(blah);//Causes exception because socket is closed

我的问题是套接字正在关闭,但我认为不应该。 try-with-resources 创建了一个 BufferedReader,然后在我离开 try 块时自动关闭它,但由于某种原因,它也关闭了整个套接字!因此,当我稍后使用相同的套接字访问我的响应代码时,我得到了一个异常。有没有什么办法解决这一问题?还是我只需要不使用 try-with-resources (这不太理想)?

【问题讨论】:

    标签: java sockets bufferedreader try-with-resources


    【解决方案1】:

    BufferedReader.close() 关闭后台流。

    解决方法是不传播 close() 的“包装”流

    【讨论】:

    • 你知道哪些流不传播 close() 吗?
    • Java 运行时中没有。你需要自己写
    • "BufferedReader.close() 关闭支持流" ...关闭套接字的输入或输出流会关闭另一个流和套接字本身。
    【解决方案2】:

    代码:

    new BufferedReader(
       new InputStreamReader(
          sock.getInputStream()))
    

    将套接字流包装到包装在 BufferedReader 中的读取器中,但它是唯一的流。

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 2021-09-15
      相关资源
      最近更新 更多