如何在 TCP 连接上收到 [FIN,ACK] 时通知 Java 应用程序?

How can a Java application be informed on receipt of a [FIN,ACK] on a TCP connection?

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

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

因此,问题是 Apache 从 Jonas 接收所有数据,即使 Apache 无法将其发送到 JMeter。

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

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

在 JDK 7 发布之前,有人谈论过 "raw sockets" java 实施,但不知何故,我认为它从未付诸实施。

Can my Java application be triggered on receipt of the FIN,ACK send from Apache ?

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