Сетевой слушатель на Java - PullRequest
       14

Сетевой слушатель на Java

1 голос
/ 04 декабря 2009

Я хочу проверить, когда интернет отключится, могу ли я зафиксировать это событие. У меня нет нужного API или какого-либо примера, который объяснил бы то же самое.

Я использую сокет для связи (TCP) и открываю сокет, когда сеть доступна. Я заметил, что сокет не дает никаких исключений в случае отключения сети.

Если бы кто-то сделал или какие-либо примеры ссылок были бы очень полезны, спасибо заранее

Ответы [ 4 ]

3 голосов
/ 04 декабря 2009

Проблема в том, что в tcp-соединениях нет события 'сеть отключена', они просто отключаются.

По предложению Джерома вам следует проверить, не истекло ли время ожидания.

Конечно, если сеть выйдет из строя, вы не сможете получать пакеты и не сможете отправлять их, поэтому базовые InputStream и OutputStream сгенерируют IOException, но только когда они поймут, что сеть не работает должным образом (обычно 2*rtt = 120 секунд, это зависит от того, как управляется уровень TCP).

Смотрите диаграмму состояний самостоятельно: alt text

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

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

2 голосов
/ 04 декабря 2009

TCP предназначен для тихой работы в режиме ожидания. При отсутствии ожидающих пакетов в сети нет административных пакетов. Если во время простоя соединение разорвано, вы не будете знать, какой бы ни была настройка времени ожидания. У него есть keepalive, но он бесполезен на рекомендованной частоте 2 часа и более.

Для обнаружения устаревших соединений вам нужно добавить в протокол приложения тактовый сигнал или keepalive. Keepalive - это не что иное, как noop-пакет, отправляемый через регулярные промежутки времени для запуска тайм-аута TCP, когда соединение не работает. В моем приложении я делаю это каждые 10 секунд.

2 голосов
/ 04 декабря 2009

Не так просто определить, отключена сеть или просто медленная.

Если вы установите тайм-ауты, он выдаст исключение, если это займет слишком много времени:

Для розеток:

socket.setSoTimeout(CONNECTION_TIMEOUT);

Для соединений HttpURLC:

HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECTION_TIMEOUT);
con.setReadTimeout(CONNECTION_TIMEOUT);
0 голосов
/ 04 декабря 2009

Почему бы вам не попробовать пинговать www.google.com

См. http://java.sun.com/j2se/1.5.0/docs/guide/nio/example/Ping.java

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...