Java 为什么URL.openConnection()允许我读取标题?

Java 为什么URL.openConnection()允许我读取标题?,java,networking,Java,Networking,我最近在试验java网络,我发现了一件有点奇怪的事情,假设你有 URL url = new URL("http://www.google.com"); URLConnection con = url.openConnection(); 然后我可以调用方法,比如con.getContentLength()等等,它们会给我正确的值,即使我没有调用con.connect()。这怎么可能?我的意思是,URLConnection从何处/如何获取这些头,我还没有调用con.connect(),因此没有发送

我最近在试验java网络,我发现了一件有点奇怪的事情,假设你有

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

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

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


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

“因此未发送任何请求”。要求进行事实调查。尝试tcpdump、fiddler、ethereal、wireshark,尝试禁用网络。我99%的猜测是:它可以在需要时为您连接。(编辑:事实上,我假设
url.openConnection()
打开连接-该方法还有什么用途)尝试拔下电缆,在这种情况下,我无法读取标题。小提琴手什么也看不出来。不知道如何使用tcpdump,将尝试wireshark。没有必要,真的吗?您已经确定它确实建立了连接。由于这种行为明显违反了文档,并且类在JDK中已经存在很长时间了,我不得不相信您正在做一些您没有在这里展示的事情。您能否创建一个简单的独立程序来演示这种行为并将其放在您的帖子中?另外,Java版本也会很有用。基本上,我正在做共享google文档文件的url连接。问题是,我看不到内部发生了什么,因为所有连接都通过https,当我使用getContentLength()时,会建立什么样的连接。好吧,http只允许5或6种消息类型(GET、POST等),它们中的哪一种是在这里生成的?除非您更改方法,否则如果您调用了setDoOutput(true),则为POST,否则为GET。这些都有文档记录。在文档记录的地方,我没有找到任何关于
openConnection
的文档,除了“在调用方法
connect
之前它不会做任何事情”,也没有关于
getContentLength
的文档,除了“它返回内容长度”。请你详细说明一下“这些都有文件记录”好吗?