我目前有一个基于JVM的网络客户端,它使用标准java.net.HttpURLConnection执行HTTP长轮询(aka comet)请求。我的连接超时设置非常高(1小时)。对于大多数用户,它工作正常。但有些用户没有收到服务器发送的数据,最终会在1小时后超时。
我的理论是(NAT)路由器超时并丢弃它们的连接,因为它们在服务器发送任何数据之前就已经空闲了很长时间。
我的问题是:
我可以为java.net.HttpURLConnection使用的连接启用TCP keep-alive吗?我找不到办法做到这一点。
我应该使用不同的API(而不是HttpURLConnection)吗?
其他解决方案?
答案 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将是一个选项。