2010-08-06 78 views
20

我只是想知道当我们调用关闭与socket相关的inputStream和outStream时,java会做什么。与socket上的close调用有什么不同,例如Socket.close()。直接关闭Input/OutputStream和关闭Socket有什么区别?

如果我们只是关闭套接字上的io流,但不关闭套接字,我们能重新打开套接字上的io流吗?

在此先感谢!

+0

请参阅http://stackoverflow.com/questions/484925/does-closing-the-bufferedreader-printwriter-close-the-socket-connection – Istao 2010-08-06 22:54:28

回答

10

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

+0

关闭输出流==关闭套接字。 flush + fin可能无法完成,因为在shutdownOutput – irreputable 2010-08-07 22:43:14

+3

这完全不正确。如果需要,关闭输出流将刷新* stream *(请参阅FilterOutputStream.close()),然后关闭它和套接字。关闭socket *或*调用shutdownOutput *不会刷新套接字(即它的发送缓冲区),它只是在当前套接字发送缓冲区的末尾排队一个FIN。除非它设置了一个积极的“逗留”超时,否则之后会发生什么情况与关闭过程是异步的。 – EJP 2010-08-08 03:26:56

+4

我在不同的互联网上,而不是你的?阅读javadoc。 'shutdownOutput' - “任何先前写入的数据将被发送,然后是TCP的正常连接终止序列”'getOutputStream' - “关闭返回的OutputStream将关闭相关的套接字''close' - 关于flush和FIN没有任何说明。 – irreputable 2010-08-08 19:28:26

17

从Java API文档Socket

公共无效的close() 抛出IOException异常 关闭此套接字。 当前在此套接字上的I/O操作中被阻塞的任何线程都将抛出SocketException。

套接字关闭后,它不能用于其他网络使用(即不能重新连接或反弹)。需要创建一个新的套接字。

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

如果此套接字有关联的通道,那么通道也会关闭。

关闭Socket的InputStream将导致关闭Socket。关闭Socket的OutputStream也是一样。

从Java API文档Socket#getInputStream()

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

查看API文档,这是出于某种原因。

+0

所以您要说InputStream.close调用Socket.close,后者又调用InputStream.close,后者又调用Socket.close,后者又调用InputStream.close .....? – Pacerier 2012-07-15 20:41:32

+0

关闭流时关闭套接字。如果您调用InputStream.close并尝试从套接字读取,它将引发异常。 Socket.close关闭套接字的输入和输出流,在各个流上调用close并不会调用Socket.close,但仍然会导致关闭的套接字。 – Jes 2012-07-30 11:03:20

+0

当然它调用Socket.close()。 “关闭”标志避免了无限回归。 – EJP 2012-08-28 18:24:42

1

这更像是一个比一个很好的答案评论:(我宁愿注释添加到一个以上的答案,但我没有REP)

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

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

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

+0

您关闭然后重新打开套接字并期望它保持连接的概念是没有意义的。 – EJP 2013-10-10 23:03:09

+1

@EJP我不认为你的评论有帮助或公平。这个“概念”不是我的,它的提问者暗示了这个概念。如果你仔细阅读我的答案,你会看到我知道你不能关闭然后重新打开一个套接字。我已经重新回答了我的回答,因此更容易明白我的观点。 – PMorganCA 2013-10-31 22:58:52