Могу ли я установить HttpConnectionParams.setSoTimeout () после пары readLine () - PullRequest
1 голос
/ 02 ноября 2010

Я пытаюсь написать кометную потоковую передачу HTTP на основе JAVA. Я использую Apache httpClient 4.x для этого. Так как это потоковая передача кометы HTTP, все события поступают клиенту в виде фрагментированных данных. Поскольку соединение может оставаться открытым в течение длительного времени, я пытаюсь реализовать динамическую настройку SO_TIMEOUT после некоторых данных readLine () с сервера.

Когда я устанавливаю значение для SO_TIMEOUT после readLine из BufferedInputStream, оно не вступает в силу, оно все еще использует исходное значение SO_TIMEOUT, установленное до вызова метода execute ().

Ниже приводится определение SO_TIMEOUT с веб-сайта apache: Определяет время ожидания сокета (SO_TIMEOUT) в миллисекундах, которое является временем ожидания для ожидания данных или, другими словами, максимальным периодом бездействия между двумя последовательными пакетами данных). Значение времени ожидания, равное нулю, интерпретируется как бесконечное время ожидания.

В соответствии с приведенным выше определением значение SO_TIMEOUT должно сбрасываться httpclient apache при поступлении всех порций данных. Если это так, он должен принять мое новое значение SO_TIMEOUT. Любая идея о том, как я могу установить значение SO_TIMEOUT после прочтения нескольких строк формы BufferedInputStream?

Ответы [ 3 ]

2 голосов
/ 02 ноября 2010

Согласно приведенному выше определению, значение SO_TIMEOUT должно сбрасываться httpclient apache при поступлении всех порций данных.

Я думаю, что вы читаете смысл в цитируемый Javadoc, который не был предназначен авторами.Я не читаю текст, чтобы означать, что вы можете динамически корректировать время ожидания при чтении потока ответов.

На самом деле, если вы изучите код setSoTimeout() и проследуете к местам, где находится параметрочевидно, что значение используется только тогда, когда должен быть создан метод HTTP.Изменения, внесенные после этого времени, не влияют на способ обработки текущего запроса или ответа.Ищите HttpMethodDirector.applyConnectionParams.

Любая идея о том, как я могу установить значение SO_TIMEOUT после прочтения пары строк из BufferedInputStream?

Я думаю, что вам лучше всего было бырасширьте класс HttpConnection, добавив метод, который изменяет SO_Timeout для сокета соединения.

0 голосов
/ 02 ноября 2010

HttpConnection.setSocketTimeout . 'Устанавливает значение SO_TIMEOUT непосредственно в базовый сокет.' Это вступит в силу при следующем считывании блокировки в базовом сокете. Конечно, если у вас есть BufferedInputStream и в нем уже есть данные, вы вообще не будете блокировать, пока не исчерпаете его.

0 голосов
/ 02 ноября 2010

Я считаю, что после вызова open() для объекта HttpConnection любые изменения в HttpConnectionParams не вступят в силу.Взгляните на Javadocs для HttpConnection.В нем говорится:

Для сокета установлены следующие параметры до получения потоков ввода / вывода в методе open ():

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

...