Обрабатывать исключения без сбоя сокета сервера? - PullRequest
0 голосов
/ 14 декабря 2010

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

Сервер аварийно завершает работу и возвращает 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());
}
}
}

Ответы [ 2 ]

1 голос
/ 27 января 2011

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

Первый Пример использования исполнителя от Google

1 голос
/ 14 декабря 2010

Я бы порекомендовал поместить while body в блок try / catch, так как любая ошибка там нарушает цикл.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...