繁体   English   中英

关闭Input / OutputStream和直接关闭Socket有什么区别?

[英]What is the difference between closing Input/OutputStream and closing Socket directly?

我只是想知道当我们在inputStream上调用close并使用与套接字关联的outStream时java会做什么。 与套接字上的close调用有什么区别,即Socket.close()。

如果我们只关闭套接字上的io流,但不关闭套接字,我们可以再次重新打开套接字上的io流吗?

提前致谢!

Socket的java api文档:

public void close()throws IOException关闭此套接字。 当前在此套接字上的I / O操作中阻塞的任何线程都将抛出SocketException。

一旦套接字关闭,它就无法用于进一步的网络连接(即无法重新连接或反弹)。 需要创建一个新的套接字。

关闭此套接字也将关闭套接字的InputStream和OutputStream。

如果此套接字具有关联的通道,则通道也将关闭。

关闭Socket的InputStream将导致Socket关闭。 关闭Socket的OutputStream也是如此。

来自Socket#getInputStream()的java api文档

关闭返回的InputStream将关闭关联的套接字。

检查API文档,这是有原因的。

您应该关闭从套接字创建的最外面的输出流。 那将冲洗它。 关闭套接字或输入流不会这样做,所以它是不够的。 关闭该输出流后,您无需执行任何其他操作。

这更像是评论而不是一个好的答案:(我宁愿在上面的答案中添加一条评论,但我没有代表)

正如我所读到的那样,问题是“我可以关闭套接字上的流,然后在同一个套接字上打开一个流吗?”......但人们似乎在回答这个问题:“我应该如何干净地关闭我的套接字?” ......这不是被问到的问题。

被问到的问题的答案是“不”。 关闭流时,关闭套接字。

(我确实理解为什么,至少在一种情况下,有人可能会问这个问题。当你通过套接字传输Java属性时,接收端必须看到EOF才能识别属性的结束 - 接收者看到EOF发送者必须关闭流/套接字。但是,如果你有一个命令/响应协议在该套接字上运行,你不想关闭它,否则你将丢失你想要发送响应的通道。参见Java流Socket上的属性,用于处理此问题的一种方法)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM