Как узнать текущую скорость передачи в Commons HttpClient 3.x - PullRequest
1 голос
/ 16 ноября 2009

У меня есть код, который выполняет HTTP GET, POST и PUT, используя Commons HttpClient 3.1 . Я хотел бы предоставить текущий индикатор скорости передачи в моем графическом интерфейсе, но не смог найти какие-либо методы для определения скорости передачи обрабатываемого HttpMethod.

Я мог бы просто рассчитать время передачи и сделать простую математику после ее завершения, чтобы определить, какова была скорость, но это дает плохой пользовательский опыт во время длительной загрузки или загрузки. Кто-нибудь знает, как определить скорость передачи запроса Commons HttpClient , пока он еще обрабатывается?

Ответы [ 2 ]

3 голосов
/ 16 ноября 2009

Я не использовал HttpClient широко, поэтому может быть простой хук. Однако представляется, что HttpConnection.getResponseInputStream () возвращает простое InputStream.

Чтобы добавить хук самостоятельно, вам нужно переопределить HttpConnectionManager и HttpConnection, чтобы вернуть оформленный поток, который отслеживает количество прочитанных байтов. Затем вы можете запустить второй поток для опроса этого потока и отображения скорости передачи, или (лучше) создать поток с обратным вызовом каждые N байтов (лучше, потому что вам не нужно заботиться о параллелизме, и вы также можете установить N такой, что обратный вызов вызывается только для больших файлов).

1 голос
/ 06 сентября 2012

Более простой способ - расширить HttpEntityWrapper и переопределить метод getContent():

public InputStream getContent() throws IOException {
    InputStream wrappedin = wrappedEntity.getContent();
    return new MyTransferRateInputStream(wrappedin);
}

Позже вы можете добавить это как перехватчик ответа

httpClient.addResponseInterceptor(HttpResponseInterceptor itcp)

Таким образом, вам не нужно переопределять упомянутые HttpConnectionManager и HttpConnection

...