【问题标题】:How it comes that URL.openConnection() allows me to read header?URL.openConnection() 是如何让我读取标题的?
【发布时间】:2013-07-17 18:45:34
【问题描述】:

我最近在试验 java 网络,发现有点奇怪,假设你有

URL url = new URL("http://www.google.com");
URLConnection con = url.openConnection();

然后我可以调用方法,例如con.getContentLength() 等等,即使我没有调用con.connect(),它们也会给我正确的值。怎么可能?我的意思是,URLConnection 从哪里/如何获取这些标头,我还没有调用con.connect(),所以没有发送任何请求,所以当时应该没有标头可用。

【问题讨论】:

  • “所以没有发送请求”。要求进行事实核查。尝试 tcpdump、fiddler、ethereal、wireshark,尝试禁用网络。我 99% 的猜测是:它会在需要时为您连接。 (编辑:事实上,我假设url.openConnection() 打开连接 - 该方法还有什么用途)
  • 尝试拔掉电缆,在这种情况下我无法读取标题。提琴手什么也没显示。不知道如何使用tcpdump,将尝试wireshark。
  • 不需要,真的吗?您已经确定它确实实际上建立了连接。
  • 由于这种行为明显违反了文档,并且这些类在 JDK 中已经存在很长时间了,我不得不相信你正在做一些你没有在这里展示的事情。您能否创建一个简单的独立程序来演示此行为并将其放在您的帖子中?此外,Java 版本会很有用。
  • 基本上,我正在做 url 连接到共享的 google doc 文件。问题是我看不到里面发生了什么,因为所有连接都通过 https

标签: java networking


【解决方案1】:

当您调用任何需要响应的方法时,实际的 TCP 连接会隐式发生,例如 getContentLength()、getInputStream()、getResponseCode()。它不会发生在 openConnection() 中。请求在此时发送。

除非您正在使用其中一种流模式,并且您正在对请求内容执行 PUT 或 POST,在这种情况下,当您开始编写请求时连接会打开。

【讨论】:

  • 当我使用 getContentLength() 时建立了什么样的连接。 AFAIK,http 只允许 5 或 6 种消息类型(GET、POST 等),它们中的哪一个是在这里制作的?
  • 除非您更改方法,否则如果您调用了 setDoOutput(true),则为 POST,否则为 GET。这些都有记录。
  • 在记录的地方,我没有找到任何关于 openConnection 的文档,此外,“在你调用方法 connect 之前它不会做任何事情”,也没有关于 getContentLength 的文档,除了“它返回内容长度”。您能否详细说明“这一切都记录在案”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-12
  • 1970-01-01
  • 2020-03-28
  • 2020-04-07
  • 1970-01-01
  • 2022-12-03
相关资源
最近更新 更多