Chr*_*ris 58 java connection networking
你如何检查你是否可以通过java连接到互联网?一种方法是:
final URL url = new URL("http://www.google.com");
final URLConnection conn = url.openConnection();
... if we got here, we should have net ...
Run Code Online (Sandbox Code Playgroud)
但是,是否有更适合执行该任务的东西,特别是如果您需要经常进行连续检查并且极有可能丢失互联网连接?
Jon*_*eet 46
您应该连接到实际应用程序所需的位置.否则,您正在测试您是否与某个无关的地方有联系(在这种情况下为Google).
特别是,如果您正在尝试与Web服务进行通信,并且如果您可以控制Web服务,那么拥有某种廉价的"获取状态"Web方法将是一个好主意.通过这种方式,您可以更好地了解您的"真实"通话是否可行.
在其他情况下,只打开一个应该打开的端口的连接可能就足够了 - 或者发送ping.InetAddress.isReachable
可能是适合您需求的API.
Mar*_*tus 20
您基本上提供的代码,加上调用connect
应该足够了.所以,是的,可能只是谷歌不可用,但你需要联系的其他网站,但有多大可能?此外,此代码只应在您实际无法访问外部资源时执行(在一个catch
块中尝试找出导致失败的原因)所以我会说如果您感兴趣的外部资源和 Google都没有可用的机会是你有网络连接问题.
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Ste*_*n C 17
人们建议使用INetAddress.isReachable.问题是某些站点配置其防火墙以阻止ICMP Ping消息.因此,即使Web服务可访问,"ping"也可能会失败.
当然,反过来也是如此.即使Web服务器已关闭,主机也可能会响应ping.
当然,由于本地防火墙限制,计算机可能无法直接连接到某些(或所有)Web服务器.
根本问题是"可以连接到互联网"是一个定义不明确的问题,如果没有这样的事情很难测试:
因此,一般来说,最简单的解决方案是让应用程序只是尝试访问它需要访问的任何内容,并依靠人工智能来进行诊断.
如果您使用的是java 6,可以使用NetworkInterface检查可用的网络接口.就是这样的:
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
NetworkInterface interf = interfaces.nextElement();
if (interf.isUp() && !interf.isLoopback())
return true;
}
Run Code Online (Sandbox Code Playgroud)
还没有尝试过.
这段代码:
"127.0.0.1".equals(InetAddress.getLocalHost().getHostAddress().toString());
Run Code Online (Sandbox Code Playgroud)
返回 - 对我来说 - true
如果离线false
,否则.(好吧,我不知道这对所有电脑都是如此).
这比其他方法的工作速度快得多.
编辑:我发现这只有工作,如果用于互联网连接的"翻转开关"(在笔记本电脑上)或其他一些系统定义的选项,是关闭的.也就是说,系统本身知道不寻找任何IP地址.
此代码应该可靠地完成工作.
请注意,使用该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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
InetAddress.isReachable
如果存在互联网连接,有时会返回 false。
在 java 中检查互联网可用性的另一种方法是:此函数进行真正的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;
}
}
Run Code Online (Sandbox Code Playgroud)
我通常将其分为三个步骤。
如果在任何时候失败,我都会向用户提供适当的错误消息。