Как предотвратить зависание приложения, если сервер недоступен? - PullRequest
3 голосов
/ 19 марта 2009
InetAddress serverAddr = InetAddress.getByName(serverAddress);
String hostname = serverAddr.getCanonicalHostName();
Socket socket = new Socket(serverAddr, portNumber);
// Freezes before this line if the server is unavailable
socket.setSoTimeout(3000);

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

Ответы [ 3 ]

6 голосов
/ 19 марта 2009

Используя конструктор с двумя аргументами , вы указываете Java подключиться немедленно. То, что вы ищете, скорее всего

Socket socket = new Socket();
// Configure socket here
socket.connect(new InetSocketAddress(serverAddr, portNumber), 3000);
if (! socket.isConnected()) {
    // Error handling
} else {
    // Use socket
}

Это все равно будет блокироваться на 3 секунды. Если вы хотите предотвратить это, используйте поток для соединения.

3 голосов
/ 19 марта 2009

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

0 голосов
/ 19 марта 2009

Это может быть слишком упрощенно (поскольку не имеет отношения к тому, как «повторно объединить» потоки после завершения соединения - при условии, что вам нужно это сделать.)

Кроме того, если это будет происходить часто, вы хотите использовать Executor (пул потоков) вместо того, чтобы вручную создавать свой собственный Thread - создание / удаление потоков стоит дорого.

Я также пренебрегаю обработкой исключений в этом фрагменте (что не совсем тривиально).

Runnable runnable = new Runnable() {
   public void run() {
      InetAddress serverAddr = InetAddress.getByName(serverAddress);
      String hostname = serverAddr.getCanonicalHostName();
      Socket socket = new Socket(new InetSocketAddress(serverAddr, portNumber), 3000);
      /* ... do more of your after-connection processing here, assuming it doesn't
       * need to be in the original "dispatch" thread.
       */
   }
};

Thread t = new Thread(runnable);
t.start();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...