有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (6) 个答案

  1. # 1 楼答案

    如果您只想检查它是否连接到internet,请使用此方法,如果internet已连接,则返回true,如果您使用您试图通过程序连接的站点的地址,则更可取

         public static boolean isInternetReachable()
        {
            try {
                //make a URL to a known source
                URL url = new URL("http://www.google.com");
    
                //open a connection to that source
                HttpURLConnection urlConnect = (HttpURLConnection)url.openConnection();
    
                //trying to retrieve data from the source. If there
                //is no connection, this line will fail
                Object objData = urlConnect.getContent();
    
            } catch (Exception e) {              
                e.printStackTrace();
                return false;
            }
    
            return true;
        }
    
  2. # 2 楼答案

    在许多情况下,“isReachable”方法不值得我使用。您可以滚动到底部,查看我的备选方案,以便简单地测试您是否在线并能够解析外部主机(即google.com)。。。它通常在*NIX机器上工作

    问题

    关于这一点有很多议论:

    第1部分:问题的可再现示例

    注意,在这种情况下,它失败了

           //also, this fails for an invalid address, like "www.sjdosgoogle.com1234sd" 
           InetAddress[] addresses = InetAddress.getAllByName("www.google.com");
          for (InetAddress address : addresses) {
            if (address.isReachable(10000))
            {   
               System.out.println("Connected "+ address);
            }
            else
            {
               System.out.println("Failed "+address);
            }
          }
              //output:*Failed www.google.com/74.125.227.114*
    

    第2部分:黑客解决方案

    作为替代方案,您可以执行以下操作:

    // in case of Linux change the 'n' to 'c'
        Process p1 = java.lang.Runtime.getRuntime().exec("ping -n 1 www.google.com");
        int returnVal = p1.waitFor();
        boolean reachable = (returnVal==0);
    

    ping的-c选项将允许ping仅尝试访问服务器一次(与我们在终端上使用的无限ping相反)

    如果可以访问主机,则返回0。否则,您将得到“2”作为返回值

    简单得多——但它当然是特定于平台的。 使用这个命令可能会有一些特权警告——但我发现它可以在我的机器上运行


    请注意: 1) 此解决方案不符合生产质量。这有点像黑客。如果谷歌关闭,或者您的互联网暂时变慢,或者即使您的权限/系统设置有一些问题,If也可能返回错误否定(即,即使可以访问输入地址,它也可能失败)。 2) isReachable故障是一个悬而未决的问题。同样——有一些在线资源表明,由于JVM试图到达主机的方式,在撰写本文时没有“完美”的方法来完成这项任务——我猜这是一项本质上特定于平台的任务,虽然简单,但JVM尚未充分抽象

  3. # 3 楼答案

    由于您可以ping计算机,因此您的Java进程应该以足够的权限运行以执行检查。可能是因为使用了较低范围的端口。如果您使用sudo/superuser运行java程序,我敢打赌它会工作

  4. # 4 楼答案

    我不确定2012年最初的问题被问到的时候是什么状态

    现在,ping将作为根执行。通过ping可执行文件的授权,您将看到+s标志,以及属于root的进程,这意味着它将作为root运行。在ping所在的位置运行ls-liat,您应该会看到它

    所以,如果您运行InetAddress。getByName(“www.google.com”)。isReacheable(5000)作为根,它应该返回true

    您需要对原始套接字进行适当的授权,该套接字由ICMP(ping使用的协议)使用

    地址。getByName与ping一样可靠,但您需要对进程拥有适当的权限才能使其正常运行

  5. # 5 楼答案

    我来这里是为了得到同一个问题的答案,但我对任何答案都不满意,因为我正在寻找一个独立于平台的解决方案。下面是我编写的代码,它与平台无关,但需要关于另一台机器上任何打开端口的信息(我们大部分时间都有)

    private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
        // Any Open port on other machine
        // openPort =  22 - ssh, 80 or 443 - webserver, 25 - mailserver etc.
        try {
            try (Socket soc = new Socket()) {
                soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
            }
            return true;
        } catch (IOException ex) {
            return false;
        }
    }
    
  6. # 6 楼答案

    只需明确提到它,因为其他答案没有。isReachable()的ping部分要求在Unix上具有root访问权限。正如bestsss在{a1}中指出的:

    And if you ask why ping from bash doesn't, actually it does need as well. Do that ls -l /bin/ping.

    因为在我的情况下,使用root不是一个选项,所以解决方案是允许我感兴趣的特定服务器访问防火墙中的端口7