我正在尝试编写一个基于JAVA的comet HTTP流。我为此使用 apache httpClient 4.x。由于它是 Comet HTTP 流,因此所有事件都以分块数据的形式到达客户端。由于连接可能会长时间保持打开状态,因此我尝试在来自服务器的一些 readLine() 数据后实现 SO_TIMEOUT 的动态设置。
当我在 BufferedInputStream 的 readLine 之后设置 SO_TIMEOUT 的值时,它没有生效,它仍然使用在execute()方法调用之前设置的原始 SO_TIMEOUT 值。
以下是apache网站上SO_TIMEOUT的定义: 定义套接字超时(SO_TIMEOUT),以毫秒为单位,这是等待数据的超时时间,或者换句话说,两个连续数据包之间不活动的最大时间段。超时值为零被解释为无限超时。
根据上面的定义,SO_TIMEOUT 值应该在每个分块数据到达时由 apache httpclient 重置。如果是这种情况,它应该接受我较新的 SO_TIMEOUT 值。关于如何在读取 BufferedInputStream 中的几行后设置 SO_TIMEOUT 值有什么想法吗?
最佳答案
As per the above definition, SO_TIMEOUT value should get reset by the apache httpclient on the arrival of every chunked data.
我认为您正在阅读引用的 javadoc 的含义,这并非作者的本意。我不读文本意味着您可以在读取响应流时动态调整超时。
事实上,如果您检查 setSoTimeout()
的代码并跟踪使用该参数的位置,很明显,仅在要创建 HTTP 方法时才使用 value 。该时间之后所做的更改不会影响当前请求或响应的处理方式。查找HttpMethodDirector.applyConnectionParams
。
Any idea on how I can set the SO_TIMEOUT value after reading couple of lines form BufferedInputStream?
我认为最好的选择是扩展 HttpConnection 类以添加一个更改连接套接字的 SO_Timeout 的方法。
关于java - 我可以在几个 readLine() 之后设置 HttpConnectionParams.setSoTimeout(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4074253/