我正在处理一个Android相关的问题,但它并不是特定于Android的问题。
使用org.apache.http.client.HttpClient,我可以向一个大小为1kb的URL发出请求,并且整个响应都包含在HttpResponse中:
HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://10.16.83.67/1kb.log");
HttpResponse response = null;
BufferedReader rd = null;
response = client.execute(request);
我可以从响应中获取 HttpEntity:
HttpEntity entity = response.getEntity();
rd = new BufferedReader(new InputStreamReader(entity.getContent()));
然后,使用BufferedReader...
while ((line = rd.readLine()) != null) {
// ... parse or whatever
}
我正在观察 WireShark,对于上述代码,我看到每个方向都有一次传输:请求日志文件,然后整个日志作为响应被传送。但是,如果我请求更大的内容,比如我的 1MB 日志文件,我会看到非常不同的情况。数据被分成帧并在 rd.readLine() 循环中通过网络流式传输。似乎最初的响应中包含了大约 1kb 的数据。然后,随着 readLine() 的运行,它会向服务器发出其他请求,并将数据流式传输到套接字。如果网络连接中断,我会收到一个 IO 错误。对于大型请求,entity.isStreaming() 是 true。这是一个异步调用(在 Android 上是强制性的,因为不能在 UI 线程上进行网络调用),但我不想继续,直到我确定已经从此请求接收到所有数据。简单地等待一段时间然后继续并希望一切顺利,不幸的是,这不是一个选项。我的问题是:我的 HttpClient、HttpGet、HttpResponse 或 HttpEntity 对象是否知道何时完成从此请求接收数据?还是我必须依赖 BufferedReader 来知道流何时关闭?