2013-06-09 2 views
6

Я работаю над проектом Java, который должен иметь подключение к Интернету в любое время.Как проверить подключение к Интернету в Java

Я хочу, чтобы моя программа продолжала проверять подключение к интернету через определенные промежутки времени (скажем, 5 или 10 секунд) и отображать сообщение, как только не обнаружено интернет-соединение.

Я пытался использовать isReachable метод для достижения этой функциональности, ниже код -

try 
{ 
    InetAddress add = InetAddress.getByName("www.google.com"); 
    if(add.isReachable(3000)) System.out.println("Yes"); 
    else System.out.println("No"); 
} 
catch (UnknownHostException e) 
{ 
    System.out.println("unkownhostexception"); 
} 
catch (IOException e) 
{ 
    System.out.println("IoException"); 
} 

Но этот код всегда возвращает «Нет». В чем проблема с этим кодом?

Благодаря

+1

http://stackoverflow.com/questions/9922543/why-does-inetaddress-isreachable-return-false-when-i-can-ping -the-ip-address – uselpa

+0

Спасибо, но решение, предлагаемое там, не работает в моем случае. автор также сказал, что его просто взломать может не работать в некоторых случаях. –

ответ

9

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

Однако, например, если вы выберете именованный узел, ping может выйти из строя из-за сбоя DNS-поиска.

Думаю, вам не стоит беспокоиться об этой проблеме: если вашей программе требуется подключение к Интернету, это происходит потому, что она отправляет или принимает данные. Соединения не являются концепцией , как река, но больше похожи на дорогу. Поэтому просто используйте Java-стандарт для работы с ошибками соединения: IOExceptiions. Когда ваша программа должна отправлять данные, базовый API будет выдавать IOE в случае, если сеть не работает. Если ваша программа ожидает данных, вместо этого используйте тайм-аут или что-то подобное, чтобы обнаружить возможные ошибки в сетевом стеке и сообщить об этом пользователю.

15

Я согласен с предложением Раффаэле, если вам просто нужно часто пользоваться Интернетом. Просто попробуйте сделать это и будьте готовы справляться с исключениями, когда он терпит неудачу.

Если вам по каким-либо причинам необходимо следить за доступностью Интернета, даже если вы еще не собираетесь использовать его и не знаете, с кем будете подключаться, просто попробуйте подключение к известному сайт (google.com, amazon.com, baidu.com ...).

Это будет работать, чтобы проверить несколько сайтов:

public static void main(String[] args) { 
    System.out.println(
     "Online: " + 
     (testInet("myownsite.example.com") || testInet("google.com") || testInet("amazon.com")) 
    ); 
} 


public static boolean testInet(String site) { 
    Socket sock = new Socket(); 
    InetSocketAddress addr = new InetSocketAddress(site,80); 
    try { 
     sock.connect(addr,3000); 
     return true; 
    } catch (IOException e) { 
     return false; 
    } finally { 
     try {sock.close();} 
     catch (IOException e) {} 
    } 
} 
+1

Да, я делаю что-то подобное. Большое спасибо ! –

+0

Это работает, спасибо большое. Метод testInet() - вот что делает трюк. – russellhoff

Смежные вопросы