Pregunta

Tengo un código que realiza un montón de HTTP GET, POST y PUT usando Comunes HttpClient 3.1.Me gustaría proporcionar un indicador de velocidad de transferencia actual en mi GUI, pero no pude encontrar ningún método para determinar la velocidad de transferencia de un HttpMethod que se está procesando.

Fácilmente podría cronometrar la transferencia y hacer algunos cálculos simples después de que se completara para determinar cuál era la velocidad, pero esto proporciona una mala experiencia de usuario durante una carga o descarga larga.¿Alguien sabe cómo determinar la tasa de transferencia de una solicitud Commons HttpClient? mientras ¿Todavía está en proceso?

¿Fue útil?

Solución

No he utilizado HttpClient ampliamente, lo que puede ser un gancho simple. Sin embargo, parece que HttpConnection.getResponseInputStream () devuelve un InputStream sencilla.

Para añadir el gancho a sí mismo, lo que se necesita para anular HttpConnectionManager y HttpConnection, para devolver una secuencia decorado que lleva la cuenta del número de bytes leídos. A continuación, puede girar un segundo hilo para sondear esta corriente y mostrar la velocidad de transferencia, o (mejor) crear la corriente con una devolución de llamada cada N bytes (mejor, ya que no tiene que preocuparse por la concurrencia, y también puede establecer N de tal manera que la devolución de llamada solamente se invoca para archivos grandes).

Otros consejos

Un gancho más simple sería extender el HttpEntityWrapper y anular el getContent() método:

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

Más tarde puedes agregar esto como interceptor de respuesta.

httpClient.addResponseInterceptor(HttpResponseInterceptor itcp)

De esa manera no es necesario anular lo mencionado. HttpConnectionManager y HttpConnection

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top