2011-05-22 180 views
2

當客戶端嘗試連接到服務器時,如果服務器關閉,則嘗試設置超時,如果發生超時異常,連接將等待10秒。 在我的情況下,代碼波紋管拋出IOException沒有等待,我真的不明白!套接字連接不超時

public boolean establishConnection() 
{ 
    System.out.println ("Connecting to " + 
      this.getServerHostname() + " au port " + this.getServerPort()+ " ..."); 

    try { 

     SocketAddress sockaddr= new InetSocketAddress(_serverHostname, _serverPort); 
     _echoSocket = new Socket(); 
     _echoSocket.connect(sockaddr,10000); 
     return _echoSocket.isConnected(); 


    } catch (UnknownHostException e) { 
     System.err.println("Unknown Host: " + this.getServerHostname()); 
     return false; 
    } catch (SocketTimeoutException e) { 
     System.err.println("Timeout"); 
     return false; 
    } catch (IOException e) { 
     System.err.println("IOException : " + 
       this.getServerHostname() + ":" + this.getServerPort()); 
     return false; 
    } 
} 
+0

而你得到的例外是....? – debracey 2011-05-22 16:04:10

回答

4

如果連接請求未得到應答,您將只會收到超時。如果服務器立即拒絕它,或者服務器不存在,您將立即收到異常。

+0

如果服務器不存在,那麼在套接字的API中有什麼方法可以設置超時?或者我必須用Java定時器 – outellou 2011-05-22 16:24:20

+1

我不明白:如果程序知道連接失敗,爲什麼要設置超時?但是可以肯定的是,你可以調用Thread.sleep()來等待10秒鐘 - 不需要像'Timer'那樣使用任何複雜的東西。 – 2011-05-22 16:31:03

0

但是,這是你想達到什麼?
如果你的意圖是,如果服務器暫時關閉,10秒後再試一次,那麼你的做法是錯誤的。
您應該嘗試與服務器建立連接,並且如果因服務器關閉而發生異常,則可以將sleep保存10秒鐘,然後再次嘗試請求。
否則歐內斯特的回答是正確的