如何检查互联网连接存在于Java的?(How to check if internet connec

2019-07-17 13:34发布

你如何检查是否可以通过Java连接到互联网? 一种方法是:

final URL url = new URL("http://www.google.com");
final URLConnection conn = url.openConnection();
... if we got here, we should have net ...

但是,有没有更合适些来执行任务, 特别是如果你需要做的检查,连续常常和互联网连接的损失是很可能发生的?

Answer 1:

您应该连接到您的实际应用需要的地方。 否则,你测试你是否有(在这种情况下,谷歌)的地方无关的连接。

特别是,如果你想谈论到Web服务,如果你在Web服务的控制的时候,这将是一个不错的主意,有某种廉价“获取状态”网络的方法。 这样,你有你的“真实”的呼叫是否有可能合作一个更好的主意。

在其他情况下,刚刚开放到应该是开放的可能足以端口的连接 - 或发送ping命令。 InetAddress.isReachable可能是在这里你需要一个合适的API。



Answer 2:

你基本上提供的代码,再加上电话connect应该是足够的。 所以,是的,它可能是只是谷歌不是可用,但您需要联系其他网站上,但是,可能性有多大? 此外,当你真正无法访问外部资源(在此代码应只执行catch块,试图找出失败的原因是),所以我会说,如果两个你感兴趣谷歌外部资源是不可机会是你有网连接问题。

private static boolean netIsAvailable() {
    try {
        final URL url = new URL("http://www.google.com");
        final URLConnection conn = url.openConnection();
        conn.connect();
        conn.getInputStream().close();
        return true;
    } catch (MalformedURLException e) {
        throw new RuntimeException(e);
    } catch (IOException e) {
        return false;
    }
}


Answer 3:

人们使用INetAddress.isReachable建议。 问题是,一些网站配置自己的防火墙来阻止ICMP ping消息。 因此,一个“平”可能会失败,即使Web服务访问。

当然,反过来也是如此。 主机可以响应ping即使Web服务器已关闭。

当然,一台机器可能无法直接连接到某些(或全部)Web服务器由于本地防火墙的限制。

最根本的问题是,“可以连接到Internet”是不明确的问题,这种事情是很难测试而不:

  1. 在用户的机器和“本地”的网络环境,并在信息
  2. 什么应用程序需要访问的信息。

所以一般情况下,最简单的解决方案是一个应用程序只是尝试访问需要的地方访问,并依傍人类的智慧做诊断。



Answer 4:

如果你在Java 6可以使用NetworkInterface的检查可用的网络接口。 即是这样的:

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
  NetworkInterface interf = interfaces.nextElement();
  if (interf.isUp() && !interf.isLoopback())
    return true;
}

有没有尝试过自己,但。



Answer 5:

此代码应可靠地完成这项工作。

需要注意的是使用时try-with-resources声明我们并不需要关闭的资源。

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class InternetAvailabilityChecker
{
    public static boolean isInternetAvailable() throws IOException
    {
        return isHostAvailable("google.com") || isHostAvailable("amazon.com")
                || isHostAvailable("facebook.com")|| isHostAvailable("apple.com");
    }

    private static boolean isHostAvailable(String hostName) throws IOException
    {
        try(Socket socket = new Socket())
        {
            int port = 80;
            InetSocketAddress socketAddress = new InetSocketAddress(hostName, port);
            socket.connect(socketAddress, 3000);

            return true;
        }
        catch(UnknownHostException unknownHost)
        {
            return false;
        }
    }
}


Answer 6:

此代码:

"127.0.0.1".equals(InetAddress.getLocalHost().getHostAddress().toString());

返回-我- true ,如果离线,和false ,否则。 (好吧,我不知道,如果这真的到所有计算机)。

这工作比其他的方法,在这里要快得多。


编辑:我发现这只是工作,如果“翻转开关”(上一台笔记本电脑),或一些其他系统定义的选项,用于Internet连接,处于关闭状态。 这,本身知道不找任何IP地址的系统。



Answer 7:

我通常把它分成三个步骤。

  1. 我先看看我是否能解析该域名的IP地址。
  2. 然后我试着通过TCP(端口80和/或443)连接并正常关闭。
  3. 最后,我将发出一个HTTP请求,然后检查200响应回来。

如果它失败在任何时候,我提供相应的错误信息给用户。



Answer 8:

URL url=new URL("http://[any domain]");
URLConnection con=url.openConnection();

/*now errors WILL arise here, i hav tried myself and it always shows "connected" so we'll open an InputStream on the connection, this way we know for sure that we're connected to d internet */

/* Get input stream */
con.getInputStream();

放入尝试catch块上面的语句,如果在捕获的异常是指有没有建立网络连接。 :-)



Answer 9:

使用NetworkInterface的代码,以等待网络为我工作,直到我从固定网络地址转换为DHCP。 轻微的增强使得它与DHCP也工作:

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
    NetworkInterface interf = interfaces.nextElement();
    if (interf.isUp() && !interf.isLoopback()) {
    List<InterfaceAddress> adrs = interf.getInterfaceAddresses();
    for (Iterator<InterfaceAddress> iter = adrs.iterator(); iter.hasNext();) {
        InterfaceAddress adr = iter.next();
        InetAddress inadr = adr.getAddress();
        if (inadr instanceof Inet4Address) return true;
            }
    }
}

这适用于Java 7中的openSUSE中13.1 IPv4网络。 与原代码的问题是,虽然界面上涨从暂停恢复后,IPv4网络地址尚未分配。 等待这个任务之后,程序可以连接到服务器。 但我不知道在IPv6的情况下做的。



Answer 10:

InetAddress.isReachable某个时候返回false,如果互联网连接存在。

在Java中,检查网络可用性的另一种方法是:这个功能做一个真正的ICMP ECHO平。

public static boolean isReachableByPing(String host) {
     try{
                String cmd = "";
                if(System.getProperty("os.name").startsWith("Windows")) {   
                        // For Windows
                        cmd = "ping -n 1 " + host;
                } else {
                        // For Linux and OSX
                        cmd = "ping -c 1 " + host;
                }

                Process myProcess = Runtime.getRuntime().exec(cmd);
                myProcess.waitFor();

                if(myProcess.exitValue() == 0) {

                        return true;
                } else {

                        return false;
                }

        } catch( Exception e ) {

                e.printStackTrace();
                return false;
        }
}


Answer 11:

1)找出其中你的应用程序需要连接到。

2)建立一个工作进程,以检查InetAddress.isReachable监测到该地址的连接。



Answer 12:

该代码包含一个JUnit测试类我用它来测试连接是否可用的范围内。 我总是收到一个连接,但如果你检查的内容长度,如果不知道它应该是-1:

  try {
    URL url = new URL("http://www.google.com");
    URLConnection connection = url.openConnection();

    if(connection.getContentLength() == -1){
          fail("Failed to verify connection");
    }
  } 
  catch (IOException e) {
      fail("Failed to open a connection");
      e.printStackTrace();
  }


Answer 13:

public boolean checkInternetConnection()
{
     boolean status = false;
     Socket sock = new Socket();
     InetSocketAddress address = new InetSocketAddress("www.google.com", 80);

     try
     {
        sock.connect(address, 3000);
        if(sock.isConnected()) status = true;
     }
     catch(Exception e)
     {
         status = false;       
     }
     finally
     {
        try
         {
            sock.close();
         }
         catch(Exception e){}
     }

     return status;
}


Answer 14:

还有一个选择的gradle --offline这可能导致你想要的行为。



Answer 15:

下面这段代码可以让我们得到我们的Android设备上的网络状态

public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            TextView mtv=findViewById(R.id.textv);
            ConnectivityManager connectivityManager=
                  (ConnectivityManager) this.getSystemService(Context.CONNECTIVITY_SERVICE);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if(((Network)connectivityManager.getActiveNetwork())!=null)
                    mtv.setText("true");
                else
                    mtv.setText("fasle");
            }
        }
    }


文章来源: How to check if internet connection is present in Java?