使用Java检测Internet连接[复制](Detect internet Connection

2019-06-14 17:47发布

可能重复:
如何检查互联网连接出现在java吗?

我想看看是否有人具有检测,如果使用Java时,有互联网连接的简单方法。 目前的应用中使用“的InternetGetConnectedState”方法在WinInit DLL适用于Windows,但我的应用程序需要为MAC操作跨平台,这样将无法工作。 我不知道JNI在所有要么在Java中使用的DLL,并成为令人沮丧的快。

只有我能想到的办法都特林打开一个URL连接到一个网站,如果失败,返回false。 我的另一种方式是在下面的,但我不知道这是否是总体稳定。 如果我拔掉我的网线我做尝试创建的InetAddress时得到一个UnknownHostException。 否则,如果连接了电缆,我得到一个有效的InetAddress对象。 我没有测试在Mac下面的代码呢。

感谢您的任何实例或建议,您可以提供。

更新:最后代码块是在底部。 我决定采取一个HTTP请求的建议(在这种情况下,谷歌)。 它的简单,发送到该网站的请求被返回的数据。 如果我不能得到从连接任何内容,也没有互联网。

public static boolean isInternetReachable()
        {
            try {

                InetAddress address = InetAddress.getByName("java.sun.com");

                if(address == null)
                {
                    return false;
                }

            } catch (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return false;
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return false;
            }
            return true;
        }

最后的代码块:

//checks for connection to the internet through dummy request
        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 (UnknownHostException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return false;
            }
            catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return false;
            }
            return true;
        }

Answer 1:

这是一个完全合理的方法来解决这个问题。 坏的事情是,你真的测试DNS,而不是测试整个网络,但实际上,你可以经常与治疗那些等同度日。

其他的事情要记住,是你将需要设置一个系统属性来关闭DNS缓存在Java运行时。 否则,它可能会继续向大家报告,网络了基于缓存的数据(即使它已关闭)。

另一种方法是实际打开一个HTTP请求到一些网络地址,比如这个每隔一段时间。



Answer 2:

我要补充的是,虽然上面给出的最终代码块是好的,它有一个缺点 - 它可能为它需要很长的时间来联系指定的地址,但该地址仍然可以到达。

在我的实例和一个地址进行测试时该方法将返回true,但需要10秒或更长的时间才能得到回应。 在这种情况下,服务器端可达,但不能用于任何有用的目的,因为这种联系是如此之慢。 这是因为默认的超时HttpURLConnection0,或无限。

出于这个原因,我建议你做的检查关闭UI线程,并添加urlConnect.setConnectTimeout(1000); 收到主叫urlConnect.getContent();

你知道地址这种方式是访问,并且它不会花费5年来下载10K文件。

(您可能当然要更改超时时间,以满足您的需求)

另外,我建议你不检查一个通用地址(google.com等),除非你的程序通常比访问几个域的更多。 如果你只是访问一个或两个,然后检查域名。



Answer 3:

请注意,它可能返回false如果java.sun.com没有响应! 在这种情况下,你应该检查另一个网站是一定的。



Answer 4:

没有测试过这一点,但我建议看java.net.NetworkInterface.getNetworkInterfaces()。 这将返回所有网络接口的机器上的枚举,则返回null有没有。

我不知道,如果是安全的假设,一个非空的响应,确保有效的网络连接 - 根据您的需求,您可能会或可能不会需要过滤掉回送地址(我想你可以用java.net做每个.NetworkInterface.getInetAddresses()返回的NetworkInterface,然后在每一个呼叫InetAddress.isLoopbackAddress()。)



Answer 5:

可以肯定,你可以达到给定的服务的唯一方法,就是做一个假性请求到该服务。 坪可通过防火墙阻止。 有些服务器可能是可达的,别人没有。 如果你需要跟一个web服务,有一个静态页面返回的这些请求。

此外,请记住试图达到之前询问用户。



Answer 6:

这个问题其实没有意义。 没有所谓的“连接到Internet”没有这样的事。 你必须尝试创建一个。 提到在Windows API只告诉你你是否调制解调器拨打或没有,我已经看到了它实际上会导致拨号插件,这是不完全的想法。 这并不是说我有一个拨号对过去8年左右。



Answer 7:

与第一个解决方案的问题在于,InetAddress类具有一个缓存,因此,当你失去未来数调用的名称是通过Java缓存解决了连接。 随着URL连接的形式给出你应该取HTML,所以你有数据消费,您使用的getContent问题。 如果调用都做得非常频繁,可能是一个问题(更何况,如果你没有运行该软件的设备上的无限数据计划)。

我认为最好的办法是做一个接近它全成连接后inmediatly一个TCP连接到80端口。 这将表现为最终的代码,但将有少得多的流量。



文章来源: Detect internet Connection using Java [duplicate]