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

时间:2010-08-06 22:03:20

标签: java sockets

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

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

提前致谢!

3 个答案:

答案 0 :(得分:17)

来自Socket的java api文档:

  

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

     

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

     

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

     

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

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

来自Socket#getInputStream()

的java api文档
  

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

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

答案 1 :(得分:10)

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

答案 2 :(得分:1)

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

我读到的问题是"我可以关闭套接字上的流,然后在同一个套接字上打开一个流吗?" ...但是人们似乎在回答这个问题:& #34;我应该如何干净地关上我的插座?" ......这不是被问到的问题。

被问到的问题的答案是" no"。关闭流时,关闭套接字。

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