基于JVM的longpoll / comet客户端:路由器终止空闲连接

时间:2011-08-29 21:23:20

标签: java comet httpurlconnection long-polling keep-alive

我目前有一个基于JVM的网络客户端,它使用标准java.net.HttpURLConnection执行HTTP长轮询(aka comet)请求。我的连接超时设置非常高(1小时)。对于大多数用户,它工作正常。但有些用户没有收到服务器发送的数据,最终会在1小时后超时。

我的理论是(NAT)路由器超时并丢弃它们的连接,因为它们在服务器发送任何数据之前就已经空闲了很长时间。

我的问题是:

我可以为java.net.HttpURLConnection使用的连接启用TCP keep-alive吗?我找不到办法做到这一点。

我应该使用不同的API(而不是HttpURLConnection)吗?

其他解决方案?

2 个答案:

答案 0 :(得分:1)

java.net.HttpURLConnection处理Keep-Alive标题transparently,它可以被控制,默认情况下 。但是你的问题不在Keep-Alive,这是一个更高级别的标志,表明服务器应在处理第一个请求后关闭连接,而是等待下一个请求。

在您的情况下,OSI堆栈较低级别的某些内容可能会中断连接。因为在如此长的时间内保持开放但空闲的TCP连接永远不是一个好的选择(具有两个开放连接的FTP协议:一个用于命令,一个用于数据具有相同的问题),我宁愿实现某种断开连接/在客户端重试故障安全过程。

事实上,安全限制可能只需几分钟,而不是几小时。只需每60秒或5分钟主动断开与HTTP服务器的连接。应该做的伎俩。

答案 1 :(得分:0)

似乎没有办法为HttpURLConnection打开TCP keep-alive。

当版本4.2出现TCP keep-alive支持时,Apache HttpComponents将是一个选项。