【问题标题】:How can a Java application be informed on receipt of a [FIN,ACK] on a TCP connection?如何在 TCP 连接上收到 [FIN,ACK] 通知 Java 应用程序?
【发布时间】:2015-05-14 10:20:18
【问题描述】:

我从 JMeter 实例到 Apache 服务器以及从 Apache 服务器到部署在 Jonas 中的 Java 应用程序建立了 2 个连接。

当我终止 JMeter 进程时,与 Apache 的连接会通过 [RST] 关闭。然后 Apache 向 Jonas 发送一个 [FIN, ACK]。 Jonas 还没有发送所有数据,所以它一直在发送数据。 Jonas 稍后使用 [FIN,ACK] 关闭连接。 TCP RFC 中描述了此行为。

因此,问题在于 Apache 接收来自 Jonas 的所有数据,即使 Apache 无法将其发送到 JMeter。

我的问题是:我的 Java 应用程序可以在收到 Apache 发送的 FIN,ACK 时触发吗?

【问题讨论】:

    标签: java apache tcp jonas


    【解决方案1】:

    我的 Java 应用程序可以在收到 Apache 发送的 FIN,ACK 时触发吗?

    是的,但您必须从连接中读取。您将以各种形式之一获得流的结尾,具体取决于您调用的读取方法。请参阅 Javadoc。

    【讨论】:

    • 我使用 BufferedInputStrem。 Javadoc 为方法 read() 指出:“如果由于到达流的末尾而没有可用的字节,则返回值 -1。此方法阻塞,直到输入数据可用,检测到流的末尾,或者抛出异常。”在 OutpustStream 中的几次 write() 之后,我在 InputStream 上使用 read() 来检查连接是否正常。但即使我收到 ACK TCP,该方法也会返回 -1。可能是因为没有要读取的数据,我只想捕获 FIN,ACK。你知道另一种方法吗?
    【解决方案2】:

    不是直接的,最终 java 可能会从 InputStream 或 OutputStream 抛出一个 IOException,但这取决于平台。

    在 JDK 7 发布之前,有人谈论过“原始套接字”java 实现,但不知何故,我认为它从未起步。

    【讨论】:

    • OuputStream 没有抛出 IOException。我应该阅读 InputStream 并等待抛出 IOException 吗?还是等待 -1 返回?
    • 如果你通过代码你应该到达 SocketOutputStream.socketWrite0 ,这是一个本地方法,取决于你的操作系统/jvm,它会抛出一个异常(参见:stackoverflow.com/questions/2309561/…
    • IOException 最终会被抛出,但首先会有很多缓冲,因此可能需要多次写入才能得到它。
    猜你喜欢
    • 2013-04-27
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    相关资源
    最近更新 更多