1

我正在尝试编写基于 JAVA 的彗星 HTTP 流。我为此使用 apache httpClient 4.x。由于它是彗星 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 值的任何想法?

4

3 回答 3

2

根据上面的定义,SO_TIMEOUT 值应该在每个分块数据到达时由 apache httpclient 重置。

我认为您正在阅读作者不打算引用的 javadoc 的含义。我不阅读文本意味着您可以在读取响应流时动态调整超时。

实际上,如果您检查代码setSoTimeout()并跟踪使用参数的地方,很明显 value 仅在即将创建 HTTP 方法时使用。在此之后所做的更改不会影响当前请求或响应的处理方式。寻找HttpMethodDirector.applyConnectionParams

在从 BufferedInputStream 中读取几行后如何设置 SO_TIMEOUT 值的任何想法?

我认为您最好的选择是扩展 HttpConnection 类以添加一个更改连接套接字的 SO_Timeout 的方法。

于 2010-11-02T02:30:26.053 回答
0

我相信在调用open()HttpConnection 对象后,对 HttpConnectionParams 的任何更改都不会生效。查看 HttpConnection 的Javadocs。它说:

在 open() 方法中获取输入/输出流之前,在套接字上设置了以下选项:

...
Socket.setSoTimeout(int) SO_TIMEOUT HttpConnectionParams.setSoTimeout(int)
...

于 2010-11-02T02:21:36.083 回答
0

HttpConnection.setSocketTimeout。'直接在底层套接字上设置 SO_TIMEOUT 值。' 这将在底层套接字上的下一次阻塞读取时生效。当然,如果你有一个 BufferedInputStream 并且它已经有数据,那么在你用完之前你根本不会阻塞。

于 2010-11-02T06:54:27.997 回答