如何在Commons HttpClient 3.x中获得当前的传输速率

时间:2009-11-16 12:09:08

标签: java apache-commons-httpclient

我有一些代码使用Commons HttpClient 3.1执行大量HTTP GET,POST和PUT。我想在我的GUI中提供当前的传输速度指示器,但是无法找到任何方法来确定正在处理的HttpMethod的传输速率。

我可以轻松地调整传输时间并在完成后进行一些简单的数学运算来确定速度,但这会在长时间上传或下载期间提供糟糕的用户体验。有没有人知道如何确定Commons HttpClient请求的传输速率还在处理它?<​​/ p>

2 个答案:

答案 0 :(得分:3)

我没有广泛使用HttpClient,所以可能有一个简单的钩子。但是,HttpConnection.getResponseInputStream()似乎返回一个简单的InputStream

要自己添加钩子,您需要覆盖HttpConnectionManagerHttpConnection,以返回一个跟踪读取的字节数的装饰流。然后你可以启动第二个线程来轮询这个流并显示传输速率,或者(更好)每N个字节用一个回调创建一个流(更好的是因为你不必关心并发,你也可以设置N这样只对大文件调用回调。)

答案 1 :(得分:1)

更简单的钩子是扩展HttpEntityWrapper并覆盖getContent()方法:

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

稍后您可以将其添加为响应拦截器

httpClient.addResponseInterceptor(HttpResponseInterceptor itcp)

这样您就不需要覆盖提到的HttpConnectionManagerHttpConnection