2012-03-04 49 views
8

我想知道我的網絡上的特定主機是否可達。 我的Java代碼如下:Java InetAddress.isReachable()timeout

InetAddress adr = InetAddress.getByName(host); 
if(adr.isReachable(3000)){ 
    System.out.println(host + " is reachable"); 
} 

這工作得很好,但是如果我降低超時說500毫秒,而不是,也不會指定主機到達了。我打算在一個循環中檢查不少主機,因此暫停時間很短很重要。如果我從Windows命令行手動ping主機,它將少於10ms。

那麼爲什麼Java方法需要更高的超時才能成功呢? 有沒有其他方法可以使用isReachable()

回答

5

這取決於你的意思是可達性。如果只找到在特定端口上偵聽可訪問主機的內容,則可以打開到該端口的套接字連接(例如,通過檢查端口80來查找所有HTTP服務器)。使用InetAddress.isReachable()是依賴於實現的。根據javadoc的說法,「典型的實現將使用ICMP ECHO REQUESTs」。使用Java NIO(非阻塞I/O)的「已知端口」檢查(如http(80),smb(445)等)可以具有更高的性能。我的公司有一款產品,使用「已知端口」掃描來查找運行Telnet或SSH的盒子,使用NIO,我們可以掃描大約5000個IP /秒。

+0

謝謝,基本上是的,我想連接到/檢查我需要找到的設備使用的端口10001上的主機。你可能舉出一個如何實現這個已知端口檢查的例子嗎? – Jerome 2012-03-04 14:36:05

+1

那麼,我不會去實現一個非阻塞I/O(NIO)方法。但我會說只是創建一個套接字。使用目標IP和端口10001創建一個SocketAddress。然後使用適當的超時值調用socket.connect(SocketAddress,timeout)。 Catch TimeOutException。如果socket.connect()毫無例外地返回,請關閉套接字,您知道設備正在10001上進行偵聽。對於NIO模型,請查看Netty開源項目和示例。 – brettw 2012-03-04 14:45:09