关闭输出流时 Java 套接字的行为

2022-09-01 20:44:03

有人可以解释Java套接字中的以下行为吗:

一般的想法是这样的:

  1. 打开套接字,获取 I/O 流。
  2. 写入请求,关闭流
  3. 阅读响应,在流中关闭
  4. 关闭插座。

这是我的问题/问题。

如果我使用 a 作为输出,然后将其关闭,它将关闭整个套接字,并且随后的读取操作失败得很惨。PrintWriter

相反,如果我直接使用套接字的方法,它会正确关闭输出流通道,同时保持套接字处于活动状态。shutdownOutput()

为什么关闭 PrintWriter 对象会随之关闭整个套接字?


答案 1

这可能是您的代码的样子:

Socket socket;
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.close();

现在,让我们来看看Socket的方法描述。getOutputStream()

getOutputStream

public OutputStream getOutputStream() throws IOException

返回此套接字的输出流。如果此套接字具有关联的通道,则生成的输出流将其所有操作委托给该通道。如果通道处于非阻塞模式,则输出流的写入操作将引发 .IllegalBlockingModeException

关闭返回的输出流将关闭关联的套接字。

返回:

用于将字节写入此套接字的输出流。

抛出:

IOException - 如果在创建输出流时发生 I/O 错误或套接字未连接。

从上面的描述中,我们知道关闭返回的将关闭关联的套接字。OutputStream

现在,当您关闭 时,它将关闭关联的套接字。PrintWriterOutputStream


答案 2

这可能是因为调用的方法正在通过层次结构进行回溯并调用的方法。作为方法的一部分,它还调用了 的方法,这也将结束。相反,调用该函数会发送任何以前写入的数据,后跟 TCP 的正常连接终止序列。然后,它将禁用输出流。close()PrintWriterclose()SocketOutputStreamclose()SocketOutputStreamclose()SocketSocketInputStreamshutdownOutput()


推荐