2013-01-08 94 views
2

任何機構可以解釋java.net.ConnectException:連接超時如何防止java.net.ConnectException:連接超時?

Caused by: java.net.ConnectException: Connection timed out 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:337) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:198) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:180) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:391) 
    at java.net.Socket.connect(Socket.java:579) 
    at sun.reflect.GeneratedMethodAccessor11.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at net.sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:289) 
    at net.sourceforge.jtds.jdbc.SharedSocket.(SharedSocket.java:250) 
    at net.sourceforge.jtds.jdbc.ConnectionJDBC2.(ConnectionJDBC2.java:297) 
+0

這是一個數據庫連接錯誤。你可以做一個telnet到你的數據庫服務器和端口? –

+0

是的,我試圖訪問遠程系統。所以我有連接超時你能給我解決方案我 – sivaram

+0

你可以嘗試ping服務器?另一個問題可能是SQL Server需要您手動啓用TCP/IP協議,如果您想從聯網系統連接。 –

回答

1

這意味着司機試圖打開該端口連接到IP,但有沒有 監聽一個端口 上,所以沒有人回答「連接超時」消息。

由於Arunn P約翰尼拉建議,如果你打開一個命令行,並運行

telnet localhost 4545 

而且這樣

Trying 127.0.0.1... 
telnet: Unable to connect to remote host: Connection refused 

響應,這意味着沒有人聽。例如。嘗試在該端口上打開套接字(數據庫連接)將導致連接超時異常。 (選擇4545端口是因爲我的電腦上沒有任何東西在聽)

如果它響應其他任何東西,例如

telnet localhost 3306 

Trying 127.0.0.1... 
Connected to localhost. 
Escape character is '^]'. 

這意味着該端口是開放的,並且該異常不會被拋出。 (我的電腦上有3306的MySQL正在監聽)。

很可能您的數據庫中的IP和端口號爲 connection string(請參閱 reference)是錯誤的,例如,設置爲某個沒有數據庫正在偵聽的端口。

看到這個answer和解釋HTTP Error 408 Request timeout(這是同樣的錯誤)。

編輯:

我最初給了一個錯誤的答案(如EJP指出)。這兩個錯誤在TCP層發生,同時建立連接:

  • Connection refused意味着存在意味着連接不能建立,或由EJP該連接的聲明沒有人聽的給定端口
  • Connection timeout上嘗試超時。

假設你在Java中,以下行,最終JDBC驅動程序(像),這在某些時候:之前該行執行(TCP)連接

Socket s = new Socket(IP,PORT); 

關閉此行得到執行,並且沒有發生異常,連接是建立(如在apidoc for constructor中所述)。 雖然該行執行,這是實際發生的事情(它被稱爲TCP三次握手):

TCP threeway handshake

讓我們回顧一下兩種可能的情況。首先,我們假設IP是可訪問的(例如ping IP從命令行開始向控制檯打印響應時間),但沒有進程正在偵聽PORT。三次握手將按照繪製的方式發生,但一旦連接獲得建立服務器將不會找到任何偵聽該端口的進程,並將立即關閉連接立即 - Connection refused將被拋出。

這是此例外的唯一可能結果

現在,讓我們假設IP不可達。客戶端將發送連接請求但絕不會收到連接授予。經過一段時間(超時時間)已經通過Connection timeout將被拋出。請看下面的代碼:

String reachableIP = "127.0.0.1"; 
    String unreachableIP = "10.192.0.1"; 
    int connTimeout = 1000; 
    long duration = 0;   
    try { 
     duration = System.currentTimeMillis();    
     new Socket().connect(new InetSocketAddress(unreachableIP, 3306), connTimeout); 
    } 
    catch (Exception e) { 
     duration = System.currentTimeMillis() - duration;   
     System.out.println("connect attempt duration measured in ms:" + duration); 
     System.out.println(e.getMessage()); 
    } 

輸出:

connect attempt duration measured in ms:1009 
connect timed out 

這在apidoc for connect method還指出。因此,如果目標IP不可訪問,則會拋出此異常。然而,網絡上的計算機的不可達性的原因可能很多。我想到的第一件事情是主機已關閉,或者重新考慮EJP的評論:

有很多原因,例如積壓隊列填滿或網絡連接問題可能導致此異常。

+2

'連接超時'並不意味着沒人在傾聽。這會導致'連接被拒絕',就像在你自己的測試中一樣。這意味着連接嘗試超時,可能有多種原因,如積壓隊列填滿或網絡連接問題。 – EJP

+0

感謝您的輸入,請查看更新。 – linski

+0

@EJP感謝您的輸入,請查看更新。 – linski

1

如果您能ping通sql server,那麼這可能是sql server實例中TCP/IP配置的問題。

您可以參考this question on how to enable TCP/IP也可以參考微軟的thisthis文章。

  1. 啓動SQL Server配置管理器。單擊開始,指向所有程序,然後單擊Microsoft SQL Server。單擊配置工具,然後單擊SQL Server配置管理器。
  2. 在SQL Server配置管理器的控制檯窗格中,展開「SQL Server網絡配置」。
  3. 在控制檯窗格中,單擊協議。
  4. 在詳細信息窗格中,右鍵單擊「TCP/IP」,然後單擊「啓用」。
  5. 在控制檯窗格中,單擊「SQL Server服務」。
  6. 在詳細信息窗格中,右鍵單擊「SQL Server()」,然後單擊「重新啓動」以停止並重新啓動SQL Server服務。
0

在大多數情況下,由於您的互聯網代理服務器出現連接超時問題。 確保您已在IDE的網絡設置中提供了所有代理設置以及默認的系統代理設置。

如果問題仍然存在,您必須嘗試不使用代理連接...希望它有幫助

相關問題