【发布时间】:2013-08-19 04:40:46
【问题描述】:
我正在使用 Java 套接字 (TCP) 与服务器通信。 我的问题是,当套接字关闭时,与套接字关联的输入和输出流会自动关闭吗?这样做安全吗?
【问题讨论】:
我正在使用 Java 套接字 (TCP) 与服务器通信。 我的问题是,当套接字关闭时,与套接字关联的输入和输出流会自动关闭吗?这样做安全吗?
【问题讨论】:
根据oracle docs-
You should close any streams connected to a socket before you close the
socket itself.
根据this answer“你必须关闭输出流,所以它会被刷新。这会关闭套接字和输入流。关闭其中任何一个都会关闭另外两个。你不要根本不需要关闭输入流。严格来说,为了安全起见,您可能还应该在 finally 块中关闭套接字本身。”
您可以按如下方式显式停止来自 inputStream 的传入数据
yourSocket.shutdownInput();
这会将套接字的输入流放在“流的末尾”。任何发送到套接字输入流端的数据都会被确认,然后被静默丢弃。您仍然可以将数据发送到输出套接字。同样,您必须关闭输出流和套接字。
类似地见shutdownOutput。
【讨论】:
是的。如果您关闭Socket, 的输入流或输出流,其他两个将自动关闭。
话虽如此,作为一种良好做法,您应该始终关闭您包裹在套接字周围的最外层输出流或写入器,并且可能在 finally 块中关闭套接字本身。这样可以确保最终输出被刷新。如果您使用缓冲的输出流或写入器,但您不这样做,您将丢失缓冲区中的数据。
【讨论】: