为什么HTTPURLConnection.getInputStream()需要时间

时间:2014-04-15 14:30:55

标签: java android network-programming inputstream

我有一个下载的任务&在Android(Java平台)中使用HTTP协议上传文件。

我使用以下代码上传文件:

HttpURLConnection httpURLConnection = (HttpURLConnection) serverUrl.openConnection();
....
httpURLConnection.connect();
OutputStream os = httpURLConnection.getOutputStream();

使用以下代码下载文件:

HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
...
urlConnection.connect();
DataInputStream stream = new DataInputStream(urlConnection.getInputStream());

根据我的观察,两种情况的connect()都需要时间,因为此时它正在与网络通信。对于文件上传,getOutputStream()会非常快地执行,这是否意味着它没有与网络通信?

而getInputStream()(在文件下载中)需要一些时间(大约200到2500毫秒)才能执行。这是否意味着它正在与网络通信?如果是,那为什么呢?

专家,请提供您对此的评论&如果我在任何地方都错了,请纠正我。

1 个答案:

答案 0 :(得分:1)

HTTP是请求/响应协议。您需要TCP连接。 connect()方法创建了它。然后你需要发送一个请求。你为此调用getOutputStream(),然后编写它。

此时没有任何内容被写入网络(在正常传输模式下),因为必须设置内容长度标题,并且Java在您完成写入时不知道。因此,当您调用getInputStream()(或getResponseCode())时,Java会设置内容长度标头,写入请求,等待服务器开始生成响应,读取所有响应标头,然后为您提供输入流在回应的主体的开头。所有这些步骤都需要时间。