2015-08-14 69 views
0

我想写一个简单的程序,测试我的互联网工作。但是,我目前得到不准确的结果。不管网络状态如何,我都会得到结果互联网不可用。帮助?测试是互联网在Java中?

注意。这篇文章将随着新发现的出现而更新,以帮助那些未来发现这篇文章的人。
非常感谢AndreasStehen C.他们帮助解决这种情况。
当前状态:已解决。见编辑3.


UPDATE:Stephen C's comment, Windows可能无法使用这个语法,因为Windows “[不]发送ICMP数据包”。此语法可用于* nix系统和OSX。我无法测试这个。

我的原代码:

import java.io.IOException; 
import java.net.InetAddress; 
public class ITIWApp 
{ 
    public static void main (String [] args) throws IOException 
    { 
     InetAddress gdns = InetAddress.getByName("8.8.8.8"); 

     boolean inetIsOn = gdns.isReachable(1000); 

     if (!inetIsOn) 
     { 
      System.out.println("The internet is not available."); 
     } 
     else 
     { 
      System.out.println("The internet is available."); 
     } 
    } 
} 

编辑:我也尝试过,每@Andreas [link]

Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com"); 
int returnVal = p1.waitFor(); 
boolean inetIsOn = (returnVal == 0); 


if (!inetIsOn) 
{ 
    System.out.println("The internet is not avaliable."); 
} 
else 
{ 
    System.out.println("The internet is avaliable."); 
} 

相同的结果。

编辑2:我做了这个批处理文件,只是为了确保。

@ECHO OFF 
echo ITIW? 
ping 8.8.8.8 
java ITIWApp 
pause 

结果呢?当然,我可以ping通8.8.8.8就好,0%的数据包丢失,但仍然有互联网不可用。这意味着:

  • 我能到达8.8.8.8蛮好的,
  • 的Java应用程序是否正在运行Eclipse或命令行,它仍然可以工作,████

编辑3:在Windows 10,你必须以超级管理员秘密签署帐户也可以使用-c选项上ping。要访问此帐户,您必须在命令行中运行命令net user administrator /active:yesFollow this tutorial here。感谢所有在这种疯狂中帮助我的人。

+0

防火墙是否阻止['isReachable'](https://docs.oracle.com/javase/8/docs/api/)用来确定可用性的方法? – Jeffrey

+1

可能的重复:http://stackoverflow.com/questions/9922543/why-does-inetaddress-isreachable-return-false-when-i-can-ping-the-ip-address – Andreas

+0

@Andreas该答案无效枯萎。 – DigiDuncan

回答

0

在Windows 10上,您必须登录到超级机密管理员帐户才能使用-c选项ping。要访问此帐户,您必须在命令行中运行命令net user administrator /active:yesFollow this tutorial here.感谢所有帮助我处理这种疯狂的人。

0

因为你的IP地址不对。我在我的机器上试过这段代码,它工作正常。再次检查你的IP地址。

+0

8.8.8.8是Google DNS服务器。总是起来。我只是拼了它。你在用什么IDE? – DigiDuncan

+0

请参阅编辑后的帖子,新的启示已经完成。 – DigiDuncan

1

InetAddress.isReachable的Javadoc说:

“尽力而为由实现作出努力到达主机,但防火墙和服务器配置可能会阻止导致无法访问的状态请求,而某些特定的端口可能可以访问“。

事实上,你显然不能从Java外部“ping”主机也支持这一点。您的本地网络和/或ISP有问题。

UPDATE

事实上,它也可能是您的Java应用程序没有足够的访问发送ICMP数据包。我在我的机器上试过ITIWApp程序时发现这是问题。它说当我自己运行它时,“互联网不可用”,当我用root权限运行它时,“互联网可用”。

更新2

显然,你试图在Windows上运行此。根据this answer,Windows上的Java不支持ICMP。这不是该平台上的权限问题。还请参阅Java漏洞#8133015


(对于什么是值得的,我可以“平” 8.8.8.8从这里开始。但是,当我尝试使用“远程登录”到8.8.8.8端口7,超时)

+0

有没有办法给Java这个权限? – DigiDuncan

+0

请参阅编辑后的帖子,新的启示已经完成。 – DigiDuncan

+0

为什么不能'处理p1 = java.lang.Runtime.getRuntime()。exec(“ping -c 1 www.google.com”);'工作?显然,这应该是一个本机WinNT命令。 – DigiDuncan