我正在尝试编写基于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值。关于如何在读取几行之后设置SO_TIMEOUT值的任何想法形成BufferedInputStream?
答案 0 :(得分:2)
根据上面的定义,SO_TIMEOUT值应该在每个分块数据到达时由apache httpclient重置。
我认为你正在阅读引用的javadoc中的含义,这是作者无意的。我不会读取文本意味着您可以在读取响应流时动态调整超时。
实际上,如果您检查setSoTimeout()
的代码并按照使用参数的位置进行操作,很明显只有在创建HTTP方法时才会使用该值。在此时间之后所做的更改不会影响当前请求或响应的处理方式。寻找HttpMethodDirector.applyConnectionParams
。
在从BufferedInputStream读取几行之后如何设置SO_TIMEOUT值的任何想法?
我认为最好的办法是扩展HttpConnection类,添加一个更改连接套接字SO_Timeout的方法。
答案 1 :(得分:0)
我相信在HttpConnection对象上调用open()
之后,对HttpConnectionParams的任何更改都不会生效。查看HttpConnection的Javadocs。它说:
在在open()方法中获取输入/输出流之前,套接字上设置了以下选项:
...
Socket.setSoTimeout(int)SO_TIMEOUT HttpConnectionParams.setSoTimeout(int)
...
答案 2 :(得分:0)
HttpConnection.setSocketTimeout。 '直接在底层套接字上设置SO_TIMEOUT值。这将在底层套接字上的下一个阻塞读取时生效。当然,如果你周围有一个BufferedInputStream并且它已经包含了数据,那么在你耗尽之前你根本就不会阻塞它。