我的任务是在 Android(Java 平台)中使用 HTTP 协议(protocol)下载和上传文件。
我正在使用以下代码上传文件:
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 英里秒)来执行。这是否意味着它此时正在与网络通信?如果是,那为什么会这样?
专家,请提供您对此的评论,如果我有任何错误,请纠正我。
最佳答案
HTTP 是一种请求/响应协议(protocol)。您需要一个 TCP 连接。 connect() 方法创建了它。然后你需要发送一个请求。您为此调用 getOutputStream() 并编写它。
此时还没有向网络写入任何内容(在正常传输模式下),因为必须设置内容长度 header ,而 Java 不知道您何时完成写入。因此,当您调用 getInputStream()(或 getResponseCode())时,Java 会设置内容长度 header ,写入请求,等待服务器开始生成响应,读取所有响应 header ,然后给您定位的输入流在响应正文的开头。所有这些步骤都需要时间。
关于java - 为什么 HTTPURLConnection.getInputStream() 需要时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23086731/