关闭输出流时Java套接字的行为
有人能解释一下Java套接字中的以下行为吗: 总体思路是:关闭输出流时Java套接字的行为,java,sockets,Java,Sockets,有人能解释一下Java套接字中的以下行为吗: 总体思路是: 打开套接字,获取I/O流 写请求,关闭流 读取响应,在流中关闭 合上插座 这是我的问题 如果我使用PrintWriter进行输出,然后关闭它,它将关闭整个套接字,随后的读取操作将失败 相反,如果我直接使用套接字的shutdownOutput()方法,它会正确地关闭输出流通道,同时保持套接字活动 为什么关闭PrintWriter对象会使整个套接字随之关闭?这可能是因为调用PrintWriter的close()方法可以追溯到整个层次结构,也
PrintWriter
进行输出,然后关闭它,它将关闭整个套接字,随后的读取操作将失败
相反,如果我直接使用套接字的shutdownOutput()
方法,它会正确地关闭输出流通道,同时保持套接字活动
为什么关闭
PrintWriter
对象会使整个套接字随之关闭?这可能是因为调用PrintWriter
的close()
方法可以追溯到整个层次结构,也可以调用socketoutput流的close()
方法。作为SocketOutputStream
的close()
方法的一部分,它还调用Socket
的close()
方法,这也将关闭SocketOutputStream
。调用shutdownOutput()
函数将发送之前写入的所有数据,然后发送TCP的正常连接终止序列。然后它将禁用输出流。这可能是您的代码的样子:
Socket socket;
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.close();
现在,让我们看一下Socket的getOutputStream()
方法的描述
getOutputStream
public OutputStream getOutputStream()抛出IOException
返回此套接字的输出流。
如果此套接字具有关联的通道,则生成的输出流将其所有操作委托给该通道。如果通道处于非阻塞模式,则输出流的写入操作将抛出IllegalBlockingModeException
关闭返回的OutputStream
将关闭关联的套接字。
返回:
用于将字节写入此套接字的输出流
抛出:
IOException—如果在创建输出流时发生I/O错误,或者套接字未连接
从上面的描述中,我们知道关闭返回的OutputStream
将关闭关联的套接字
现在,当您关闭PrintWriter
时,它将关闭关联的OutputStream
,这将关闭关联的套接字。可能需要在关闭之前刷新它。在关闭PrintWriter之前,您是否尝试在连接上刷新.flush(),以查看问题是否没有发生?RTFM eh:)我想这就彻底解释了。谢谢血狼@我想知道如何避免这种情况。如果我想在关闭OutputStream后保持套接字打开,该怎么办。有什么方法可以做到这一点吗?我仍然没有找到为什么的答案。“为什么关闭PrintWriter对象会使整个套接字随之关闭?”