我有一些代码使用Commons HttpClient 3.1执行一堆 HTTP GET、POST 和 PUT 。我想在我的 GUI 中提供当前传输速度指示器,但找不到任何方法来确定正在处理的 HttpMethod 的传输速率。
我可以轻松地对传输进行计时并在传输完成后进行一些简单的数学运算以确定速度,但这会在长时间上传或下载期间提供糟糕的用户体验。有谁知道如何在 Commons HttpClient 请求仍在处理时确定它的传输速率?
我有一些代码使用Commons HttpClient 3.1执行一堆 HTTP GET、POST 和 PUT 。我想在我的 GUI 中提供当前传输速度指示器,但找不到任何方法来确定正在处理的 HttpMethod 的传输速率。
我可以轻松地对传输进行计时并在传输完成后进行一些简单的数学运算以确定速度,但这会在长时间上传或下载期间提供糟糕的用户体验。有谁知道如何在 Commons HttpClient 请求仍在处理时确定它的传输速率?
我没有广泛使用HttpClient,所以可能有一个简单的钩子。但是,似乎HttpConnection.getResponseInputStream()返回一个简单的InputStream
.
要自己添加钩子,您需要覆盖HttpConnectionManager
and HttpConnection
,以返回跟踪读取的字节数的装饰流。然后,您可以启动第二个线程来轮询此流并显示传输速率,或者(更好)每 N 个字节创建一个带有回调的流(更好,因为您不必关心并发性,您还可以设置 N这样回调只对大文件调用)。
更简单的钩子是扩展HttpEntityWrapper
并覆盖该getContent()
方法:
public InputStream getContent() throws IOException {
InputStream wrappedin = wrappedEntity.getContent();
return new MyTransferRateInputStream(wrappedin);
}
稍后您可以将其添加为响应拦截器
httpClient.addResponseInterceptor(HttpResponseInterceptor itcp)
这样你就不需要覆盖提到的HttpConnectionManager
和HttpConnection