Постоянно проверяйте подключение к Интернету в java

#java #wait

#java #подождите

Вопрос:

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

Код, который я написал :

 Socket socket = null;


public void checkInternetConnectivity() throws InterruptedException {
    boolean reachable = false;
    ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
    service.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            try {
                socket = new Socket("xxx.xxx.xxx.x", xx);
            } catch (UnknownHostException e) {
                stopApp();
            } catch (IOException e) {
                stopApp();
            }
        }
    }, 0, 5, TimeUnit.SECONDS);


    synchronized (this) {
        wait();
    }
}

private void stopApp() {
    System.out.println("Internet Not Available stopping app");
    System.exit(0);
}
  

Он всегда зависал внутри ниже :

 synchronized (this) {
        wait();
    }
  

Комментарии:

1. Если вы ждете, кто-то также должен уведомить об этом? Где это?

2. если это запланированная задача, зачем ждать?

3. где вы делаете notify()?

4. @SMA- Я согласен с вами, но не уверен, где именно я здесь уведомляю.

5. почему бы этого не ожидать? Ранее все, что вы делали, это настраивали task для запуска в другом потоке.

Ответ №1:

Вы могли бы сделать:

 InetAddress.isReachable 
  

В зависимости от ваших потребностей вам следует рассмотреть возможность подключения к определенному хосту с помощью

 private static boolean googleIsAvailable() {
    try {
        final URL url = new URL("http://www.google.com");
        final URLConnection connection = url.openConnection();
        connection.connect();
        connection.getInputStream().close();
        return true;
    } catch (MalformedURLException e) {
        throw new RuntimeException(e);
    } catch (IOException e) {
        return false;
    }
}
  

Если вы общаетесь с веб-сервисом, веб-сервис должен предоставить метод GET, чтобы проверить, доступен ли он.

Если вам нужно постоянно проверять, попробуйте что-нибудь вроде

 Socket s = new Socket(SERVER_ADDRESS, TCP_SERVER_PORT);
while(s.isConnected()){
 //do your stuff
}  
  

Вам также следует проверить опцию keepAlive.

Но более важный вопрос заключается в том, что произойдет в вашем приложении, если подключение к Интернету больше не доступно?

Большинство методов генерируют исключения, если сервер больше не доступен.

Вы могли бы просто перехватить их и отреагировать на это.

Комментарии:

1. Спасибо за ваш ответ, но я думаю, что он не будет проверять постоянно. Он будет проверять только тогда, когда и где я вызываю эту функцию.

2. Обновил мой ответ… Соединения с сокетами имеют метод «isConnected»