[英]Behavior of Java sockets when closing output stream
有人可以解释Java套接字中的以下行为:
一般的想法是这样的:
这是我的问题/问题。
如果我使用PrintWriter
进行输出,然后关闭它,它会关闭整个套接字,后续的读操作会失败。
相反,如果我直接使用套接字的shutdownOutput()
方法,它会正确关闭输出流通道,同时保持套接字处于活动状态。
为什么关闭PrintWriter
对象会占用整个套接字?
这可能是您的代码的样子:
Socket socket;
PrintWriter pw = new PrintWriter(socket.getOutputStream());
pw.close();
现在,让我们看一下Socket的getOutputStream()
方法的描述。
getOutputStream
public OutputStream getOutputStream() throws IOException
返回此套接字的输出流。 如果此套接字具有关联的通道,则生成的输出流将其所有操作委托给通道。 如果通道处于非阻塞模式,则输出流的写操作将抛出
IllegalBlockingModeException
。关闭返回的
OutputStream
将关闭关联的套接字。返回:
用于将字节写入此套接字的输出流。
抛出:
IOException - 如果在创建输出流时发生I / O错误或者未连接套接字。
从上面的描述中,我们知道关闭返回的OutputStream
将关闭相关的套接字。
现在,当您关闭PrintWriter
,它将关闭关闭的OutputStream
,它将关闭相关的套接字。
这可能是因为调用PrintWriter
的close()
方法正在追溯层次结构并调用SocketOutputStream
的close()
方法。 作为SocketOutputStream
的close()
方法的SocketOutputStream
它也为Socket
调用close()
方法,这也将关闭SocketInputStream
。 调用shutdownOutput()
函数会发送任何先前写入的数据,然后发送TCP的正常连接终止序列。 然后它禁用输出流。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.