2011-04-17 85 views
5

我正嘗試使用Java套接字連接到服務器。我試圖從連接端口80到90連接到服務器的Java套接字塊

int port; 
Socket clientsocket; 
String hostname = "www.google.com"; 

for(port = 80;port<=90; port++){ 
    try{ 
    clientsocket = new Socket(hostname,port); 
    System.out.println("Connection at port " + port + "\t" + clientsocket.isConnected()); 
    clientsocket.close(); 
    } 
    catch(Exception e){ 
    System.out.println(e.getMessage()); 
    } 
} 

當我嘗試連接到像任何網站google.com或w3schools.com我的程序在socket()呼籲端口號掛80除外由於 這些網站沒有在端口81-90服務,它應該引發異常,但是會被阻塞。對於端口80,它工作正常。 當我嘗試連接到安裝在我的機器上的apache服務器時,它不會阻塞任何端口號,並且會給我提供Connection refused錯誤,這是顯而易見的行爲。 那麼爲什麼會發生。提前致謝。

+0

類似問題 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4232651 – Durin 2011-04-17 07:08:03

+0

它不是你的代碼,甚至是telnet www.google.com 81次出。 – lobster1234 2011-04-17 07:09:13

+0

@ lobster1234:謝謝你的回覆。 我上面寫的代碼是我的代碼。該錯誤的鏈接當然不是我的。 – Durin 2011-04-17 07:10:39

回答

13

當我嘗試連接到任何網站,如google.com或w3schools.com時,我的程序掛在socket()調用端口號碼除外80.因爲這些網站不在端口81-90服務,它應該引發異常,但會被阻塞。

這幾乎肯定不是Java的做法。

當您調用Socket(String, int)構造函數時,JVM會要求操作系統嘗試使用提供的端口號建立與提供名稱對應的IP地址的連接。假設我們正在談論的TCP/IP中,OS發射一個TCP「SYN」消息,並等待響應:

  • 如果響應是「SYN-ACK」時,它前進到建立根據協議進行連接;見http://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment

  • 如果響應是'RST'(重置),則連接失敗,並導致Java「連接被拒絕」異常。 (這通常是'SYN'發送到遠程服務器時發生的情況,只是發現沒有應用程序在您試圖連接的端口上「偵聽」。)

  • 如果響應是ICMP某種類型的消息(例如,ICMP目標不可達),這通常會導致連接請求立即失敗,並導致Java異常。

  • 如果沒有響應,則操作系統會再次嘗試,然後再次嘗試。根據Java默認連接超時(或顯式超時),此過程可能會持續很長時間。

因此,最有可能發生的事情是,某些東西正在過濾時髦端口上的'SYN'消息,並將其扔掉。它可以是PC上的本地防火牆軟件,網關中的防火牆軟件或ISP的網絡,也可以是您試圖與之通話的遠程系統中的軟件。或者這可能發生在'SYN-ACK'消息回來。

無論哪種方式,阻塞/超時行爲都是TCP/IP網絡固有的特性,無論是在操作系統還是Java級別都無法準確診斷。你只需要調整你的期望。 (或設置更短的連接超時...)

+0

這是如此漂亮的書面和啓發。謝謝噸。 – Durin 2011-04-17 08:16:23

+0

常見原因可能是代理。 – tkruse 2016-02-03 10:35:04

相關問題