Есть ли правильный способ обнаружить и обработать внезапно отключенный сервер - PullRequest
0 голосов
/ 14 марта 2020

Я использую этот код для обнаружения, если сервер не подключен

    private boolean isServerListening() {

    try {
        s = new Socket("localhost", PORT);
        return true;
    } catch (IOException e) {
        System.out.println(e);
        return false;
    }
}

и Thread для обработки внезапно отключенного сервера

    Thread checkServer = new Thread(() -> {
        while (true) {
            if (isServerListening()==false) {
                JOptionPane.showMessageDialog(null, "Server is disconnected!");
                System.exit(0);
            }
        }
    });

Проблема:

  1. Я думаю, что метод занял слишком много времени (около 4 секунд) для выполнения и возврата. Так есть ли правильный способ?
  2. Независимо от того, подключен сервер или нет, это Thread по-прежнему показывают JOptionPane и завершают свою программу. Я ошибаюсь в какой-то момент?

1 Ответ

1 голос
/ 14 марта 2020

Не существует общего решения, которое подходит всем. Кроме того, существуют различные типы «потерянного соединения»:

  1. Ваш компьютер отключается, поэтому он сразу знает, что соединение закрыто.
  2. Другая сторона отключается, может случиться так, что это сигнал не достигает вашего компьютера, поэтому он все равно будет думать, что вы подключены.
  3. Физическое соединение разрывается, обе стороны не могут сообщить другой стороне.

Socket имеет методы isConnected () и isClosed (), которые вы должны использовать.

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

...