java - Flash 中的 HTTP POST - 客户端在响应前关闭 TCP 连接

标签 java flash http networking tcp

我遇到了一个有趣的问题,其中 HTTP 1.1 POST 请求的 TCP 连接在请求后立即关闭(即,在服务器发送响应之前)。

关于测试环境的一些细节:

客户端 - Windows XP、Internet Explorer 8、Flash player 12。

服务器 - Java 7

在上述行为之前,我们有几个长期存在的 TCP 连接,每个连接都被多个 HTTP 请求重用;我们打开一个长投票,当这个投票完成时,打开另一个。我们看到几个小时的良好行为和重用 TCP 连接打开轮询,因为之前的轮询关闭。 最终——有时在 12 小时或更长时间的正常行为之后——对长期连接的轮询将发送 HTTP POST 并立即发送 TCP FIN,然后服务器才能写入响应

客户端的行为是让一个投票一直保持打开状态,所以此时我们尝试打开一个新的投票。

然后客户端发送另一个 HTTP POST 以相同的行为打开一个新的 TCP 连接;发送请求,然后是来自客户端的 FIN。

这种行为会持续几分钟,直到服务器最终响应杀死客户端。 (服务端通过遇到IO Exception检测到最​​初关闭的连接,下次可以和客户端通信时,响应是告诉客户端关闭)

编辑:我们只通过 Flash 客户端打开连接,并没有深入研究低级 TCP 代码。虽然 Steffen Ullrich 是正确的,并且单侧关闭是可能的并且应该被处理,但不清楚的是为什么在这个(看似任意的)点发生单侧关闭。我们不会从应用程序中调用关闭来引发此行为。

我的问题是:

  1. 在什么情况下,HTTP 请求的 TCP 连接会在收到响应之前终止?我知道这是不良行为,并且是不完整的 HTTP 事务,因此可能是由于不明原因导致连接终止。

  2. 是否有任何诊断可用于帮助理解问题? (我们目前正在使用 Wireshark 监控服务器和客户端 Activity 。)

注意事项:

在 Wireshark 中,我们看到的行为是:

  1. 为多个 HTTP 请求提供服务的长期 TCP 连接 (#1)。
  2. HTTP 请求是通过 #1 发出的。
  3. 服务器确认请求。
  4. 客户端发送 FIN 以关闭连接 #1。服务器以 FIN,ACK 响应。 (预期流量将是发送 HTTP 响应的服务器)。在这一点附近,服务器遇到 IO 异常。
  5. 客户端打开连接 #2 并发送 HTTP 请求。
  6. 行为从 3 开始继续。

最佳答案

发送请求后立即发送 FIN 不是关闭连接,而是关闭写入 shutdown(socket,SHUT_WR)。客户端以这种方式告诉服务器它不会再发送任何数据,但它可能仍会收到数据。这并不少见。

关于java - Flash 中的 HTTP POST - 客户端在响应前关闭 TCP 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22176191/

相关文章:

java - 如何在 J2ME 中解析 URL

c# - XNA Flash 或 Silverlight 集成

flash - 在Flash Pro的ActionScript3.0中使用声音文件的代码示例

android - 使用 flash 和 WebView 在 Android 中播放 RTMP 流

internet-explorer - 是否可以在 Internet Explorer 中启用 HTTP 基本身份验证?

java - 自动安装 InstallAnywhere

java - 如何使用ExecutorService批量运行任务

java - Spring Roo JPA - 为什么手动数据库更新在持久性上下文中自动可用?

http - "application/*+json"是 HTTP 中的有效 Accept header 吗

java - 将二进制数据转换为图像