我一直试图做我认为在我的应用程序互联网企业开始时主机测试的简单可达性,但文档没有帮助,也没有在各个地方找到的例子,我尝试了许多解决方案没有运气,所以如果有人可以指向一个确定的方法来检查主机可用性与android是非常棒的,如果可以到达主机,只需要将bool切换为true
我使用API8,如果这对这个过程有很大的不同,并且必须迎合非root设备,所以inetaddress.isReachable已经出来了
gho*_*555 53
它不漂亮,但这就是我做的方式:
boolean exists = false;
try {
SocketAddress sockaddr = new InetSocketAddress(ip, port);
// Create an unbound socket
Socket sock = new Socket();
// This method will block no more than timeoutMs.
// If the timeout occurs, SocketTimeoutException is thrown.
int timeoutMs = 2000; // 2 seconds
sock.connect(sockaddr, timeoutMs);
exists = true;
} catch(IOException e) {
// Handle exception
}
Run Code Online (Sandbox Code Playgroud)
Ric*_*win 23
要检查连接,您可以使用:
public boolean isOnline(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
Run Code Online (Sandbox Code Playgroud)
如果它报告连接,您还可以通过尝试执行http访问地址然后检查返回的状态代码进行检查.如果没有返回状态代码,则可以确定主机无法访问.
这是我用于任何Java 7及以上项目的代码:
/**
* Check if host is reachable.
* @param host The host to check for availability. Can either be a machine name, such as "google.com",
* or a textual representation of its IP address, such as "8.8.8.8".
* @param port The port number.
* @param timeout The timeout in milliseconds.
* @return True if the host is reachable. False otherwise.
*/
public static boolean isHostAvailable(final String host, final int port, final int timeout) {
try (final Socket socket = new Socket()) {
final InetAddress inetAddress = InetAddress.getByName(host);
final InetSocketAddress inetSocketAddress = new InetSocketAddress(inetAddress, port);
socket.connect(inetSocketAddress, timeout);
return true;
} catch (java.io.IOException e) {
e.printStackTrace();
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用而不是打开完整的套接字连接inetAddress.isReachable(int timeout).这会使检查更快但也更不精确,因为这种方法只是建立在一个echo请求上:
如果可以获得特权,则典型的实现将使用ICMP ECHO REQUEST,否则它将尝试在目标主机的端口7(Echo)上建立TCP连接.
对于我的用例,我必须建立与Web服务器的连接.因此,我必须启动并运行服务器上的服务.因此,对于简单的echo请求,套接字连接是我的首选.
try-catch-resource上面代码中的块仅适用于Java 7和更新版本.在版本7之前,finally需要一个-block来确保资源正确关闭:
public static boolean isHostAvailable(final String host, final int port, final int timeout) {
final Socket socket = new Socket();
try {
... // same as above
} catch (java.io.IOException e) {
... // same as above
} finally {
if (socket != null) {
socket.close(); // this will throw another exception... just let the function throw it
}
}
}
Run Code Online (Sandbox Code Playgroud)
host 可以是计算机名称,例如"google.com",也可以是IP地址,例如"8.8.8.8".
if (isHostAvailable("google.com", 80, 1000)) {
// do you work here
}
Run Code Online (Sandbox Code Playgroud)
Android文档:
堆栈溢出: