3 回答

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
isReachable()如果可以獲取特權(quán),將使用ICMP ECHO REQUESTs ,否則將嘗試在目標(biāo)主機(jī)的端口7(Echo)上建立TCP連接。 因此,您的問題可能是配置問題,沒有足夠的權(quán)限在客戶端計(jì)算機(jī)上執(zhí)行此操作,或者是在服務(wù)器上的端口7問題(如果您的客戶端沒有權(quán)限執(zhí)行此操作)。在您的情況下,可能兩者都有,您都需要解決另一方面,以使其正常工作。
ICMP ECHO REQUEST
我在OSX和Linux客戶端上測試了以下內(nèi)容,并且在測試其他OSX,Linux和Windows Server計(jì)算機(jī)的可達(dá)性時(shí)可以使用。我沒有Windows計(jì)算機(jī)作為客戶端運(yùn)行它。
import java.io.IOException;
import java.net.InetAddress;
public class IsReachable
{
public static void main(final String[] args) throws IOException
{
final InetAddress host = InetAddress.getByName(args[0]);
System.out.println("host.isReachable(1000) = " + host.isReachable(1000));
}
}
根據(jù)我在這里閱讀的內(nèi)容。它顯然是Windows的限制,并且ICMP PINGWindows 2000之前的系統(tǒng)調(diào)用都不支持Windows,因此默認(rèn)情況下嘗試連接到端口7,并且在您嘗試“訪問”的計(jì)算機(jī)上被阻止。Java尚不支持新的本機(jī)系統(tǒng)調(diào)用。權(quán)限是針對基于Unix的系統(tǒng),因?yàn)樗鼈冃枰猺oot才能發(fā)送ICMP數(shù)據(jù)包。
如果要為Windows 2000及更高版本推出自己的Windows本機(jī)JNI ICMP PING,則可以使用IcmpSendEcho Function。

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊
有點(diǎn)晚了,但是我在嘗試做同樣的事情時(shí)偶然發(fā)現(xiàn)了這一點(diǎn)。
一個(gè)對我有用的變通辦法,是我直接使用命令行ping來完成的。
public static boolean ping(String host)
{
boolean isReachable = false;
try {
Process proc = new ProcessBuilder("ping", host).start();
int exitValue = proc.waitFor();
System.out.println("Exit Value:" + exitValue);
if(exitValue == 0)
isReachable = true;
} catch (IOException e1) {
System.out.println(e1.getMessage());
e1.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return isReachable;
}
添加回答
舉報(bào)