Проверка доступности/доступности хоста на Android
Я пытаюсь сделать то, что, как я думал, будет простой доступностью хост-теста в начале моих интернет-проектов приложений, но документация не помогает, и ни один из примеров не найден в разных местах, ive попробовал множество решений без везения, поэтому если кто-нибудь может указать мне в сторону окончательного способа проверить доступность хостов с помощью андроида, который будет потрясающим, просто нужно, чтобы он переключил bool на true, если хост может быть достигнут
im, используя API8, если это имеет большое значение для этого процесса и должно обслуживать ненагруженные устройства, поэтому inetaddress.isReachable выходит из
Ответы
Ответ 1
Это не очень, но вот как я это сделал:
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
}
Ответ 2
Чтобы проверить подключение, вы можете использовать:
public boolean isOnline(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
return netInfo != null && netInfo.isConnectedOrConnecting();
}
Если он сообщает о соединении, вы также можете проверить с помощью попытки получить http-адрес на адрес, а затем проверить возвращаемый код состояния. если код статуса не возвращается, он довольно уверен, что хост недоступен.
Ответ 3
Решение
Java 7 и выше
Что код, который я использую для любого проекта 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;
}
}
Другой вариант (быстрее, но более неточно)
Вместо открытия полного соединения сокета вы можете использовать inetAddress.isReachable(int timeout)
. Это сделает проверку быстрее, но также более неточной, потому что этот метод просто основывается на запросе эха:
Типичная реализация будет использовать ICMP ECHO REQUESTs, если эта привилегия может быть получена, в противном случае она попытается установить TCP-соединение на порте 7 (Echo) целевого хоста.
В моем случае использования я должен был установить соединение с веб-сервером. Поэтому мне было необходимо, чтобы служба на сервере работала. Таким образом, соединение сокетов было моим предпочтительным выбором по простому запросу эха.
Ниже Java 7
Блок try-catch-resource
из приведенного выше кода работает только с Java 7 и более новой версией. До версии 7 необходим блок finally
-block, чтобы обеспечить правильное закрытие ресурса:
final Socket socket = new Socket();
try {
...
} catch (java.io.IOException e) {
...
} finally {
if (socket != null) {
socket.close(); // this will throw another exception... just let the function throw it
}
}
Использование
host
может быть либо именем машины, например "google.com", либо IP-адресом, например "8.8.8.8".
if (isHostAvailable("google.com", 80, 1000)) {
// do you work here
}
Дальнейшее чтение
Android Docs:
Stackoverflow:
Ответ 4
Попробуйте следующее:
boolean reachable = false;
try {
reachable = InetAddress.getByName("www.example.com").isReachable(2000);
} catch (IOException e) {
e.printStackTrace();
reachable = false;
}
if (reachable) {
// do your work here
}
Но это может потерпеть неудачу, даже если веб-сервер работает и работает отлично из-за того, как реализована isReachable(int timeout)
:
Проверьте, доступен ли этот адрес. Наилучшие усилия чтобы попытаться достичь хоста, но брандмауэры и сервер конфигурация может блокировать запросы, приводящие к недостижимому статусу в то время как некоторые конкретные порты могут быть доступны. Типичная реализация будет использовать ICMP ECHO ЗАПРОСЫ, если привилегия может быть получена, в противном случае он попытается установить TCP-соединение на порте 7 (Echo) хоста назначения.