2010-08-03 215 views
1

當我嘗試連接到TCP服務器時,出現以下錯誤。我的程序嘗試使用不同的線程打開大約300-400個連接,這在第250個線程中發生。每個線程使用自己的連接來發送和接收數據。java.net.SocketException連接超時錯誤

java.net.SocketException: Connection timed out:could be due to invalid address 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:372) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:233) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:220) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:385) 

這裏是我的代碼,一個線程使用獲取套接字:

socket = new Socket(my_hostName, my_port); 

是否有連接數的任何缺省限制TCP服務器可以在同一時間?如果不是如何解決這種類型的問題?

+0

處理連接的服務器上的邏輯是什麼?你正在使用線程池還是瘋狂地產生線程?如果使用線程池,如果您沒有關閉連接/完成請求,則可能會用盡線程 – 2010-08-03 19:17:49

+0

否我不使用線程池。我一次啓動一個線程。每個線程打開一個新的連接。 – jgg 2010-08-03 21:24:10

回答

5

如果服務器將ServerSocket綁定到您要連接的端口,但不接受連接,那麼您可能會收到連接超時。

如果它始終與第250個連接發生,也許服務器設置爲只接受250個連接。有人必須斷開連接才能連接。或者你可以增加超時時間;而不是創建這樣的插座,創建套接字與空的構造,然後使用connect()方法:

Socket s = new Socket(); s.connect(new InetSocketAddress(my_hostName, my_port), 90000);

默認連接超時是30秒;上面的代碼等待連接90秒,然後在連接無法建立時拋出異常。

你也可以設置一個較低的連接超時和做其他的事情,當你捕獲了異常......

+0

我會試試。謝謝! – jgg 2010-08-03 21:22:57

+0

不可以。您不能將連接超時增加到默認值以上。你只能減少它。如果小於90秒,上述代碼將在默認時間段後超時。系統之間的默認連接超時值有所不同,但大小爲一分鐘。 – EJP 2010-08-04 04:21:21

0

爲什麼所有的連接?這是一個測試程序嗎?在這種情況下,請注意,從單個客戶端打開大量連接會強調客戶端的方式不是由具有大量不同客戶端主機的實際系統執行的,因此來自該類客戶端的測試結果並非全部有效。您可能會用盡客戶端端口或其他客戶端資源。

如果它不是一個測試程序,同樣的問題。爲什麼所有的連接?你最好是運行一個連接池並重復使用少量的連接。網絡畢竟只有很多帶寬;除以400不是很有用。