Java 关闭输入/输出流和直接关闭套接字有什么区别?

Java 关闭输入/输出流和直接关闭套接字有什么区别?,java,sockets,Java,Sockets,我只是想知道当我们调用与套接字相关联的inputStream和outStream时,java会做什么。与套接字上的close调用有什么区别,即socket.close() 如果我们只是关闭套接字上的io流,而不是关闭套接字,那么我们可以重新打开套接字上的io流吗 提前谢谢 来自以下java api文档: 公众假期结束() 抛出IOException 关闭此套接字。 当前在此套接字上的I/O操作中阻塞的任何线程都将抛出SocketException 一旦插座关闭,它就无法用于进一步的网络使用(即无

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

如果我们只是关闭套接字上的io流,而不是关闭套接字,那么我们可以重新打开套接字上的io流吗


提前谢谢

来自以下java api文档:

公众假期结束() 抛出IOException 关闭此套接字。 当前在此套接字上的I/O操作中阻塞的任何线程都将抛出SocketException

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

关闭此套接字还将关闭套接字的InputStream和OutputStream

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

关闭套接字的InputStream将导致套接字关闭。关闭套接字的OutputStream也是如此


来自

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


检查API文档,它的存在是有原因的。

您应该关闭从套接字创建的最外面的输出流。那会把它冲掉的。关闭套接字或输入流都不能做到这一点,因此这是不够的。关闭输出流后,您不需要做任何其他事情。

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

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

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


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

请参阅关闭输出流==关闭套接字。flush+fin可能不会像ShutdownOutputOutput中那样执行,这是完全不正确的。关闭输出流会在必要时刷新流(请参阅FilterOutputStream.close())然后关闭它和套接字。关闭套接字或调用shutdownOutput不会刷新套接字(即其发送缓冲区),它只是在当前套接字发送缓冲区的末尾将一个FIN排队。之后发生的事情与关闭过程是异步的,除非它设置了一个正的“逗留”超时。我是否在与您不同的internet上?请阅读javadoc。
shutdownOutput
-“任何以前写入的数据都将被发送,然后是TCP的正常连接终止序列”
getOutputStream
-“关闭返回的OutputStream将关闭关联的套接字“
close
-没有提到flush和FIN。当然它们会被发送。它们在发送缓冲区中。这就是它的作用。但是它们不是通过调用shutdownOutput()来刷新的,正如您所说,它们无论如何都会被发送,并且不能保证它们在shutdownOutput()时被发送返回。您完全没有理解我关于关闭最外层的输出流的观点,这可能是一个缓冲输出流,或者是一个围绕输出流的流。如果您不关闭它,它将不会被刷新。并且无论如何关闭套接字都会发送一个FIN。所以您说InputStream.close调用socket.close,而socket.close又调用InputStream.close,它依次调用Socket.close,后者依次调用InputStream.close…?当流关闭时,套接字将关闭。如果调用InputStream.close并尝试从套接字读取,它将引发异常。Socket.close关闭套接字的输入和输出流,对单个流调用close不会调用Socket.close,但仍然会导致套接字关闭。当然,它会调用socket.close()。通过“关闭”标志可以避免无限回归。关闭然后重新打开套接字并期望它保持连接的概念是毫无意义的。@EJP我认为您的评论没有帮助,也不公平。“概念”不是我的,提问者暗示了这一点。如果你仔细阅读我的答案,你会发现我知道你无法关闭然后重新打开插座。我重新编写了我的答案,以便更容易理解我的观点。