2015-04-22 38 views
1

我的問題是:我需要發現如果一個IP和端口正在運行SMTP服務。 爲此,我使用SMTPClient嘗試打開連接。我使用下面的代碼。SMTPClient爲開放端口設置timout

private static boolean validateSMTP(String ip, int port, int timeOut) { 
    SMTPClient smtp = new SMTPClient(); 

    try { 
     smtp.setConnectTimeout(timeOut);    
     smtp.connect(ip, port); 
     return true; 

    } catch (SocketException e) { 
     LogAplication.Warning("Ops... something wrong", e); 
    } catch (IOException e) { 
     LogAplication.Warning("Ops... something wrong", e); 
    } 
    finally{ 
     smtp = null; 
    } 

    return false; 
} 

它工作正常,我得到了預期的結果,但timeOut一直是我的問題。 例如:如果我嘗試IP:127.0.0.1和端口80(IIS開放的端口)的連接步驟需要很長(遠遠超過在超時定義)拋出異常

java.net.SocketException異常:連接重置

如何爲這種情況設置超時時間?還是存在另一種方式來做我的簡單測試?

回答

1

看一看grepCode後,我發現這個方法爲connect(string host, int port)

打開連接到指定端口的遠程主機和從指定的本地地址和端口 始發一個插槽。在返回 之前,調用_connect Action()來執行連接 初始化操作。

由於端口被另一個服務開通,插座被打開,不會導致超時(通過插座),但例外是由「connectAction()」拋出 所以我需要設置一個全局超時我SMTPClient,由套接字連接和「connectAction()」使用。我這樣做是爲了解決我的問題:

smtp.setDefaultTimeout(timeOut); 

有了這個,現在我已經爲,這引發異常,當然,對於SMTP服務的成功連接打開的端口預期的結果。

+0

'smtp.setDefaultTimeout(timeOut); smtp.setConnectTimeout(timeOut);' 這兩行應該在代碼中? –

+1

setConnectTimeout:設置連接超時(以毫秒爲單位),該時間將傳遞給Socket對象的connect()方法。 setDefaultTimeout:設置打開套接字時使用的默認超時值(以毫秒爲單位)。 –