Подтвердить что ты не робот

Проверка доступности/доступности хоста на Android

Я пытаюсь сделать то, что, как я думал, будет простой доступностью хост-теста в начале моих интернет-проектов приложений, но документация не помогает, и ни один из примеров не найден в разных местах, ive попробовал множество решений без везения, поэтому если кто-нибудь может указать мне в сторону окончательного способа проверить доступность хостов с помощью андроида, который будет потрясающим, просто нужно, чтобы он переключил bool на true, если хост может быть достигнут

im, используя API8, если это имеет большое значение для этого процесса и должно обслуживать ненагруженные устройства, поэтому inetaddress.isReachable выходит из

4b9b3361

Ответ 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) хоста назначения.