【问题标题】:Will the streams associated with sockets closed automatically when the socket is closed?当套接字关闭时,与套接字关联的流会自动关闭吗?
【发布时间】:2013-08-19 04:40:46
【问题描述】:

我正在使用 Java 套接字 (TCP) 与服务器通信。 我的问题是,当套接字关闭时,与套接字关联的输入和输出流会自动关闭吗?这样做安全吗?

【问题讨论】:

    标签: java sockets stream


    【解决方案1】:

    根据oracle docs-

    You should close any streams connected to a socket before you close the
    socket itself.
    

    根据this answer“你必须关闭输出流,所以它会被刷新。这会关闭套接字和输入流。关闭其中任何一个都会关闭另外两个。你不要根本不需要关闭输入流。严格来说,为了安全起见,您可能还应该在 finally 块中关闭套接字本身。”

    您可以按如下方式显式停止来自 inputStream 的传入数据

    yourSocket.shutdownInput();
    

    这会将套接字的输入流放在“流的末尾”。任何发送到套接字输入流端的数据都会被确认,然后被静默丢弃。您仍然可以将数据发送到输出套接字。同样,您必须关闭输出流和套接字。

    类似地见shutdownOutput。

    【讨论】:

    • @EJP 确认。只想快点回答。我真诚的道歉。
    • (1) 你应该承认你的来源。您已经编辑了您的问题,但您仍然没有提供适当的归属。 (2) 关闭输入套接字不会关闭输入流。它仍然开放供阅读。反对票仍然存在。标记为抄袭。
    • "任何发送到套接字输入端的数据都会被确认,然后被静默丢弃。"不,这取决于平台。 BSD 就是这样做的。 Linux 不会丢弃数据,因此发送者最终会阻塞。 Windows 错误地发送重置。反对票仍然存在。
    • @EJP 这就是 java 文档所说的 docs.oracle.com/javase/1.4.2/docs/api/java/net/…
    • Javadoc 不正确。我在 Java 网络一书中对此进行了广泛的研究。
    【解决方案2】:

    是的。如果您关闭Socket, 的输入流或输出流,其他两个将自动关闭。

    话虽如此,作为一种良好做法,您应该始终关闭您包裹在套接字周围的最外层输出流或写入器,并且可能在 finally 块中关闭套接字本身。这样可以确保最终输出被刷新。如果您使用缓冲的输出流或写入器,但您不这样做,您将丢失缓冲区中的数据。

    【讨论】:

    • 感谢您的建议。我会这样关闭套接字。
    猜你喜欢
    • 2013-07-17
    • 2011-05-08
    • 2011-04-26
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    相关资源
    最近更新 更多