0

Я пытаюсь запустить поточный сервер сокетов, который обрабатывает несколько клиентов одновременно. Однако после того, как я подключился к серверу и выйду из него не изящным способом, скажем, закрыв окно.Обработка исключений без сбоя сервера сокетов?

Сервер аварийно завершает работу и возвращает System.out.println("Runnable terminating with exception: " + e); с e, являющимся java.Lang.NullPointerException.

Мой вопрос в том, как я могу просто закрыть сокет и поддерживать работу сервера, даже если что-то пойдет не так в handleSession(), чтобы другие могли подключиться?

Я новичок в исключениях, поэтому мое понимание по-прежнему элементарно.

publc class ThreadedHandler implements Runnable { 
    Socket incoming; 
    BufferedReader in; 
    PrintWriter out; 
    SortedTopicList topics; 

    ThreadedHandler(Socket s) { 
     incoming = s; 
    } 
    public void run() { 
     try { 
      handleSession(incoming); 
     }catch (Exception e) { 
      System.out.println("Runnable terminating with exception: " + e); 
     } 
     } 

    public void handleSession(Socket client) { 
     try { 
      //Code goes here 
     } catch (IOException e) { 
      System.err.println(e.getMessage()); 
     } finally { 
      shutdown(); 
     } 
    } 

    public void shutdown() { 
     try { 
      in.close(); 
      out.close(); 
      incoming.close(); 
     } catch (Exception e) { 
      System.err.println(e.getMessage()); 
     } 
    } 
} 

Мой главный метод заключается в следующем:

public class MessageBoardServer { 

    public static void main(String[] args) { 
     Thread t; 
     try { 
      ServerSocket ss = new ServerSocket(118118); 
      while(true) { 
       Socket session = ss.accept(); 
       t = new Thread(new ThreadedHandler(session)); 
       t.start(); 
      } 

} catch (Exception e) { 
    System.err.println(e.getMessage()); 
} 
} 
} 
+0

Что? Серверный сокет на '118118'? Оно работает? – khachik

+0

Это должно быть 8118 :) – Ash

+0

Где ваш BufferedReader и PrinteWriter инициализированы? Вы отправили весь код? – SRM

ответ

1

Использование Исполнителя для создания пула потоков и делегирования потока, выполняемого в этот пул. Даже если один поток генерирует исключение, остальные будут активны. Вы можете добавить «unhandledExceptionHandler» в Executor, где вы можете регистрировать все исключения.

Первый Executor usage example от google

1

Я бы рекомендовал поставить while тело внутри TRY/поймать блока, так как любая ошибка разражается цикла.

О NPE - кажется, что вы инициализировать BufferedReader in;, PrintWriter out; внутри метода handleSession, в try. Если что-то не удалось, то инициализируется in и/или out, он потерпит неудачу с NPE, так как shutdown вызывается в конце и закрывает in и out.

Код, указанный здесь, не разбивает основной цикл вокруг accept на NPE в run резьбы обработчика.

+0

Я предполагаю, что вы хотите обернуть цикл while, который находится в классе ThreadHandler? Кроме того, где я должен инициализировать «BufferedReader» и «PrintWriter»? Он также не работает в 'run()'. – Ash

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