2013-07-17 15 views
0

我最近用java網絡試驗,我發現有些奇怪的事情,假設你有這是怎麼來的URL.openConnection()允許我讀取標題?

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

然後我可以調用的方法,如con.getContentLength()等,他們會給我正確的價值觀,甚至不顧我沒't啓用con.connect()。怎麼可能?我的意思是,URLConnection從哪裏得到這些標題,我沒有調用con.connect(),所以沒有發送請求,所以當時沒有頭文件可用。

+0

「所以沒有請求被髮送」。要求進行事實覈查。試試tcpdump,fiddler,ethereal,wireshark,嘗試禁用網絡。我99%的猜測:它在需要時爲您連接。 (編輯:其實,我會假設'url.openConnection()'打開連接 - 該方法的用法是什麼) – sehe

+0

嘗試拔掉電纜,在這種情況下,我無法讀取標題。提琴手什麼也沒有顯示。不知道如何使用tcpdump,會嘗試wireshark。 – dhblah

+0

不需要,真的嗎?你已經確定它實際上建立了連接。 – sehe

回答

0

當您調用任何需要響應的方法(如getContentLength(),getInputStream(),getResponseCode())時,實際的TCP連接隱式發生。它不會發生在openConnection()。該請求在該點發送。

除非您正在使用其中一種流式傳輸模式,並且您正在使用請求內容執行PUT或POST,在這種情況下,您在開始編寫請求時會打開連接。

+0

當我使用getContentLength()時,進行了什麼樣的連接。 AFAIK,http只允許5或6種消息類型(GET,POST等),其中哪些是在這裏製作的? – dhblah

+0

除非您更改方法,否則如果已調用setDoOutput(true),則爲POST,否則爲GET。這全部記錄在案。 – EJP

+0

在有文檔記載的地方,我沒有發現關於'openConnection'的任何文檔,除非「調用方法'connect',否則它不會執行任何操作,除了」返回內容長度「之外,也沒有關於getContentLength的文檔。您能否詳細說明「這是所有記錄」? – dhblah

相關問題