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

标签 java android network-programming inputstream

我的任务是在 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/

相关文章:

java - 执行 .jar 文件时, `scala` 是否不需要 -jar,而 `java` 则需要?

java - 计算日期

winapi - 如何通过WinApi判断默认网卡?

c - 我应该对网络命令使用#defines 还是枚举?

java - 加载txt文件->打开失败: ENOENT (No such file or directory).我很确定问题不是路径,但我找不到错误

c++ - boost asio - 缺陷代码的更改

java - 将excel字符串数据存储到数组列表中

java - 如何使用jsp中的键从java map 获取值,但键是一个javascript值

android - 将 Player-ID 从 OneSignal 发送到 Webview Android Studio?

android - 在 Android Pie 上启动 context.startService(intent)