Как проверить, присутствует ли интернет-соединение в Java?

Ранее, ответ был представлен с тем, что является теперь первым разделом как последним разделом. глоток>

POSIX Shell включает ! Ввод по абсолютному адресу оператора

вокруг спецификации оболочки для других проблем, я недавно (сентябрь 2015) заметил, что оболочка POSIX поддерживает ! оператор. Например, это перечислено как зарезервированное слово и может появиться в начале конвейер —, где простая команда является особым случаем 'конвейера'. Это может, поэтому, использоваться в if операторы и while или until циклы также — в совместимых POSIX оболочках. Следовательно, несмотря на мое резервирование, это, вероятно, более широко доступно, чем я понял назад в 2008. Быстрая проверка POSIX, 2004 и SUS/POSIX 1997 показывают, что ! присутствовал в обеих тех версиях.

Примечание, что ! оператор должен появиться в начало из конвейера и инвертирует код статуса всего конвейера (т.е. последний команда). Вот некоторые примеры.

# Simple commands, pipes, and redirects work fine.
$ ! some-command succeed; echo $?
1
$ ! some-command fail | some-other-command fail; echo $?
0
$ ! some-command < succeed.txt; echo $?
1

# Environment variables also work, but must come after the !.
$ ! RESULT=fail some-command; echo $?
0

# A more complex example.
$ if ! some-command < input.txt | grep Success > /dev/null; then echo 'Failure!'; recover-command; mv input.txt input-failed.txt; fi
Failure!
$ ls *.txt
input-failed.txt

Портативный ответ — работает со старинными оболочками

В Границе (Korn, POSIX, Bash) сценарий, я использую:

if ...command and arguments...
then : it succeeded
else : it failed
fi

Это столь портативно, как это добирается. 'Команда и аргументы' могут быть конвейером или другой составной последовательностью команд.

А not команда

'!' оператор, ли встроенный к Вашей оболочке или обеспеченный o/s, не универсально доступен. Не ужасно трудно записать, хотя - код ниже относится ко времени, по крайней мере, 1991 (хотя я думаю, что записал предыдущую версию еще дольше назад). Я не склонен использовать это в своих сценариях, тем не менее, потому что это не надежно доступно.

/*
@(#)File:           $RCSfile: not.c,v $
@(#)Version:        $Revision: 4.2 $
@(#)Last changed:   $Date: 2005/06/22 19:44:07 $
@(#)Purpose:        Invert success/failure status of command
@(#)Author:         J Leffler
@(#)Copyright:      (C) JLSS 1991,1997,2005
*/

#include 
#include 
#include 
#include 
#include "stderr.h"

#ifndef lint
static const char sccs[] = "@(#)$Id: not.c,v 4.2 2005/06/22 19:44:07 jleffler Exp $";
#endif

int main(int argc, char **argv)
{
    int             pid;
    int             corpse;
    int             status;

    err_setarg0(argv[0]);

    if (argc <= 1)
    {
            /* Nothing to execute. Nothing executed successfully. */
            /* Inverted exit condition is non-zero */
            exit(1);
    }

    if ((pid = fork()) < 0)
            err_syserr("failed to fork\n");

    if (pid == 0)
    {
            /* Child: execute command using PATH etc. */
            execvp(argv[1], &argv[1]);
            err_syserr("failed to execute command %s\n", argv[1]);
            /* NOTREACHED */
    }

    /* Parent */
    while ((corpse = wait(&status)) > 0)
    {
            if (corpse == pid)
            {
                    /* Status contains exit status of child. */
                    /* If exit status of child is zero, it succeeded, and we should
                       exit with a non-zero status */
                    /* If exit status of child is non-zero, if failed and we should
                       exit with zero status */
                    exit(status == 0);
                    /* NOTREACHED */
            }
    }

    /* Failed to receive notification of child's death -- assume it failed */
    return (0);
}

Это возвращает 'успех', противоположность отказа, когда этому не удается выполнить команду. Мы можем дебатировать, не делают ли 'ничего успешно' опция, было корректно; возможно, это должно сообщить об ошибке, когда не просят сделать что-либо. Код в' "stderr.h"' предоставляет простые услуги сообщения об ошибке - я использую его везде. Исходный код по запросу - видит мою страницу профиля для контакта со мной.

58
задан Koray Tugay 21 December 2018 в 03:13
поделиться

6 ответов

Вы должны подключиться к месту, которое требуется вашему фактическому приложению. В противном случае вы проверяете, есть ли у вас соединение с нерелевантным местом (в данном случае с Google).

В частности, если вы пытаетесь связаться с веб-службой, и если вы контролируете эту веб-службу, Было бы неплохо иметь какой-нибудь дешевый веб-метод "получения статуса". Таким образом, у вас будет гораздо лучшее представление о том, будет ли ваш «настоящий» вызов работать.

В других случаях может быть достаточно просто открытия соединения с портом, который должен быть открыт, или отправки эхо-запроса. InetAddress.isReachable вполне может быть подходящим API для ваших нужд.

46
ответ дан 24 November 2019 в 18:50
поделиться

1) Выясните, к чему должно подключаться ваше приложение.

2) Настройте рабочий процесс для проверки InetAddress.isReachable для отслеживания подключения к этому адрес.

2
ответ дан 24 November 2019 в 18:50
поделиться

Люди предложили использовать INetAddress.isReachable. Проблема в том, что некоторые сайты настраивают свои брандмауэры на блокировку сообщений ICMP Ping. Таким образом, пинг может завершиться неудачно, даже если веб-сервис доступен.

И, конечно же, верно и обратное. Хост может ответить на эхо-запрос, даже если веб-сервер не работает.

И, конечно же, машина может быть не в состоянии напрямую подключиться к определенным (или всем) веб-серверам из-за ограничений локального брандмауэра.

Основная проблема заключается в что «может подключиться к Интернету» - это неопределенный вопрос, и такие вещи сложно протестировать без:

  1. информации о машине пользователя и «локальной» сетевой среде, и
  2. информации о том, что приложение требуется доступ.

В общем,

17
ответ дан 24 November 2019 в 18:50
поделиться

Если вы используете java 6, можете использовать NetworkInterface для проверки доступных сетевых интерфейсов. Т.е. примерно так:

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

Сам еще не пробовал.

7
ответ дан 24 November 2019 в 18:50
поделиться
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, и если исключение перехвачено, это означает, что подключение к Интернету не установлено. : -)

4
ответ дан 24 November 2019 в 18:50
поделиться

Я обычно разбиваю его на три этапа.

  1. Сначала я проверяю, могу ли я преобразовать доменное имя в IP-адрес.
  2. Затем я пытаюсь подключиться через TCP (порт 80 и / или 443) и аккуратно закрываюсь.
  3. Наконец, я отправлю HTTP-запрос и проверю ответ 200.

Если в какой-то момент произойдет сбой, я отправляю пользователю соответствующее сообщение об ошибке.

4
ответ дан 24 November 2019 в 18:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: