有人可以解释以下行为的Java插座:行为的Java插座时,请关闭输出流
的总体思路是这样的:
- 打开插座,获得I/O流。
- 写请求,收出流
- 读取响应,在流
- 关闭插座关闭。
这是我的问题。
如果我使用PrintWriter
进行输出,然后关闭它,它会关闭整个套接字,并且随后的读取操作会失败。
相反,如果我直接使用套接字的shutdownOutput()
方法,它会正确关闭输出流通道,同时保持套接字活动。
为什么要关闭PrintWriter
对象将整个套接字放在一起呢?
有人可以解释以下行为的Java插座:行为的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
将关闭关联套接字。
RTFM eh? :) 我想这可以彻底解释它。谢谢血狼! – 2012-01-17 14:49:26
@Alanmars如何避免这种情况。如果我想在关闭OutputStream后仍保持打开状态,该怎么办?有没有办法做到这一点? – 2016-06-13 10:08:21
这可能是因为调用的PrintWriter
的close()
方法追溯通过等级和调用SocketOutputStream
的close()
方法为好。作为SocketOutputStream
的close()
方法的一部分,它也调用Socket
的close()
方法,这也将在短期内关闭SocketInputStream
。调用shutdownOutput()
函数会发送之前写入的数据,然后是TCP的正常连接终止序列。然后禁用输出流。
也许你需要在关闭之前刷新它。 – 2012-01-17 05:59:05
你试图关闭您的PrintWriter,看看问题是否犯规发生之前,您连接.flush()冲洗? – vcetinick 2012-01-17 05:59:26