如何检查互联网连接是否存在于Java?

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

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

但是有什么更适合执行这个任务, 特别是如果你需要经常进行连续的检查,并且互联网连接的丢失是非常可能的?

您应该连接到您的实际应用程序需要的地方。 否则,你正在testing你是否有连接到不相关的地方(在这种情况下,谷歌)。

特别是,如果您正在尝试与Web服务进行交stream,并且您正在控制Web服务,那么拥有某种便宜的“获取状态”Web方法将是个不错的主意。 这样你就可以更好地了解你的“真实”电话是否有效。

在其他情况下,只要打开连接到应该打开的端口就足够了 – 或者发送ping命令。 InetAddress.isReachable可能是一个适合您的需求的API在这里。

人们build议使用INetAddress.isReachable。 问题是有些站点configuration防火墙阻止ICMP Ping消息。 因此,即使Web服务可访问,“ping”也可能失败。

当然,反过来也是如此。 即使networking服务器closures,主机也可以响应ping。

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

根本的问题是“可以连接到互联网”是一个不明确的问题,这种事情是很难testing没有:

  1. 用户机器和“本地”networking环境中的信息
  2. 有关应用程序需要访问的信息。

所以一般来说,最简单的解决scheme是让应用程序尝试访问需要访问的任何东西,然后回退人类智能来进行诊断。

你基本上提供的代码,加上一个connect调用应该是足够的。 所以是的,这可能只是谷歌没有的,但其他一些网站你需要联系,但有多大可能呢? 此外,只有当你实际上无法访问你的外部资源(在catch块中试图弄清楚什么是失败的原因),这个代码才应该执行,所以我会说,如果你的外部资源 Google都是没有可能你有一个networking连接问题。

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

如果您使用的是Java 6,则可以使用NetworkInterface来检查可用的networking接口。 即这样的事情:

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

还没有尝试过。

此代码:

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

返回 – 对我来说 – 如果离线则返回false ,否则返回false 。 (好吧,我不知道这是真的对所有的电脑)。

在这里起作用比其他方法快得多。


编辑:我发现这只工作,如果“翻转开关”(在笔记本电脑上),或其他系统定义的选项,为互联网连接,closures。 也就是说,系统本身知道不要查找任何IP地址。

 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(); 

把上面的语句放在try catch块中,如果抓到的exception意味着没有build立互联网连接。 🙂

我通常把它分成三步。

  1. 我首先看看我能否将域名parsing为IP地址。
  2. 然后我尝试通过TCP(端口80和/或443)连接并优雅地closures。
  3. 最后,我将发出一个HTTP请求,并检查200回应。

如果在任何时候都失败了,我会向用户提供相应的错误信息。

使用NetworkInterface的代码等待networking工作,直到我从固定networking地址切换到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; } } } 

这适用于openSuse 13.1中的Java 7 for IPv4networking。 原始代码的问题是,虽然接口从挂起恢复后已经启动,但是IPv4networking地址尚未分配。 等待这个任务后,程序可以连接到服务器。 但是我不知道在IPv6的情况下要做什么。

这个代码应该可靠地完成工作。

请注意,使用try-with-resources语句时,我们不需要closures资源。

 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; } } } 

1)找出应用程序需要连接到的地方。

2)设置一个工作进程来检查InetAddress.isReachable来监视到该地址的连接。

这段代码包含在我用来testing连接是否可用的jUnittesting类中。 我总是收到一个连接,但如果你检查内容的长度,它应该是-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(); } 
 public boolean checkIntConnection() { 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) { } finally { try { sock.close(); } catch(Exception e) { } } return status; } 

如果Internet连接存在, InetAddress.isReachable有时会返回false。

在java中检查互联网可用性的另一种方法是:此function使真正的ICMP ECHO ping成为可能。

 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; } } 

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