2013-04-30 145 views
0

在我的Java应用程序中,我需要一次获得多个连接的ping,我已经尝试对每个连接使用一个线程并测量响应时间,但它们并不都是正确的。线程安全InetAddress.isReachable()

是否有线程安全的方式来测量连接的ping /响应时间?我目前正在使用:

Thread thread = new Thread(new Runnable() { 
    public void run(){ 
     long start = System.currentTimeMillis(); 
     someInetAddress.isReachable(5000); 
     long timeTaken = System.currentTimeMillis() - start; 
    } 
}); 

然而timeTaken似乎并不为用户提供150平越来越向5000是正确的(可能更多,因为它似乎已经超时)

帮助表示赞赏! Keir

编辑:好的发现,由于Port 7对某些人而言是关闭的,有没有其他办法可以在没有Port 7关闭的情况下ping他们?

+0

是否所有用户都超时? – christopher 2013-04-30 16:41:12

+0

你必须在所有线程之间共享'someInetAddress'吗? – HeatfanJohn 2013-04-30 16:43:35

+2

防火墙?客户端是否允许ICMP Ping和/或TCP端口7(Echo)? – Fildor 2013-04-30 16:43:46

回答

1

isReachable()方法通过尝试连接到TCP端口7(回显)来工作。它实际上并不关心7号港口是否关闭。它所关心的是连接是否有任何响应。 A ConnectException费率为isReachable = true,并且它应该花费与成功连接大致相同的时间,甚至更快。连接超时,主机无法访问等,速率为false

在非常有限的情况下,该方法被宣布为使用ICMP:您不在Windows上并且拥有root权限。实际上这从来不适用。