2

我正在发出一个 http 请求,最终需要 8 分钟以上。对我来说,这个长期运行的请求工作正常。我能够毫无问题地回复我的浏览器。(我与服务器位于同一网络上)。

但是,对于某些用户,浏览器从不返回任何响应。(注意:当同一个http请求在1分钟内执行时,这些用户可以毫无问题地看到响应)

这些用户碰巧在另一个网络上。他们的位置和服务器之间可能有一两个防火墙。

我可以在他们的提琴手上看到请求只是坐在那里等待响应。

我现在假设防火墙正在杀死空闲的 http 连接.. 但我不确定。

如果您知道为什么响应永远不会回复,或者为什么连接永远不会中断......这将非常有帮助。

另外:是否可以通过编写一个 Applet 来解决这个问题,该 Applet 以某种方式设法保持向服务器发送虚拟信号,即使在向服务器发送(刷新)请求之后也是如此?

4

3 回答 3

2

用户可能位于连接跟踪防火墙/NAT 网关后面。当一段时间内没有任何事情发生时,此类网关往往会断开 TCP 连接。在自定义协议中,您可以发送某种心跳消息以保持 TCP 连接处于活动状态,但是使用 HTTP,您无法正确控制该连接,HTTP 也不能促进保持 tcp 连接“活动”所需的内容。

处理由 HTTP 请求启动的长时间运行的作业的常用方法是在后台启动该作业,立即将正确的响应发送回客户端,并让 applet/ajax 请求轮询该作业的状态并返回结果完成。

如果您需要快速修复,请查看是否可以控制服务器和用户之间网关上的任何超时。

于 2009-10-29T22:54:52.580 回答
0

您是否考虑过用户可能正在使用具有 HTTP 超时的浏览器,导致浏览器在一定时间后停止等待响应?

于 2009-10-29T22:29:13.937 回答
0

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html

如果您使用的是 Linux 机器,请尝试

# cat /proc/sys/net/ipv4/tcp_keepalive_time
  7200
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
  75
# cat /proc/sys/net/ipv4/tcp_keepalive_probes
  9

# echo 1500 > /proc/sys/net/ipv4/tcp_keepalive_time
# echo 500 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes
于 2013-10-29T14:40:22.047 回答