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

Alf*_*red 20 java sockets

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

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

提前致谢!

Jes*_*Jes 17

Socket的java api文档:

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

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

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

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

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

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

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

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


use*_*421 10

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

  • 我在与你不同的互联网上吗?阅读javadoc.`shutdownOutput` - "将发送任何先前写入的数据,然后发送TCP的正常连接终止序列"`getOutputStream` - "关闭返回的OutputStream将关闭相关的套接字"`close` - 对flush和FIN没有任何说明. (4认同)
  • 这完全是错误的.如果需要,关闭输出流会刷新*stream*(请参阅FilterOutputStream.close()),然后关闭它和套接字.关闭套接字*或*调用shutdownOutput*不会刷新套接字(即它的发送缓冲区),它只是在当前套接字发送缓冲区的末尾对FIN进行排队.之后发生的事情与关闭过程异步,除非它设置了正的"延迟"超时. (3认同)
  • 他们当然会被送去.它们在发送缓冲区中.这就是它的用途.但是,通过调用shutdownOutput(),它们不会被刷新*,正如你声称的那样,它们无论如何都会被发送,并且不能保证在shutdownOutput()返回时它们已被发送.你完全错过了关于关闭*outermost*输出流的观点,它可能是一个缓冲的输出流,或者是一个包裹着一个流的流.如果你不关闭它,它将不会被刷新.并以任何方式关闭套接字发送FIN. (2认同)