java - 我可以在几个 readLine() 之后设置 HttpConnectionParams.setSoTimeout()

标签 java comet httpclient chunked-encoding http-streaming

我正在尝试编写一个基于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/

相关文章:

java - MSSql 服务器 jpa 空间异常

Java实现区间解析int

java - 我如何从 HttpClient 获取 Bearer Token?

c# - 从数据库接收数据并将其转换为字典

java - 如何使用注释 @MyFormat ("%td.%<tm.%<tY"格式化 getBirthday()

java - 当我在 autocompletetextview 中输入空格键时,我的应用程序崩溃了

php - 实现推送通知系统的最佳方式

ajax - 如何从网页调用此 Comets 应用程序

ajax - 如何让所有连接的浏览器重新加载由服务器端事件启动

Angular HttpClient : Property 'headers' does not exist on type 'Blob'