JAVA бесконечный серверный сокет остановлен без причины - PullRequest
0 голосов
/ 29 марта 2012

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

Проблема теперь в том, что после ожидания около 2 часов без каких-либо соединений программа просто остановится без причины (без исключений).

тайм-аут установлен на бесконечность: setSoTimeout (0); Вот сегмент кода сокета сервера:

try {
        while(true) {
            socket = server.accept();
            BufferedReader ois = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            BufferedWriter oos = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            SocketHandler socketH = new SocketHandler(socket, ois, oos, this);
            Thread socketT = new Thread(socketH);
            socketT.start();
        }
    } catch (Exception e) {
        Debugger.log(e.getClass().toString() + ": " + e.getMessage());
    }

Я очень запутался, любая помощь будет очень признательна, спасибо!

1 Ответ

0 голосов
/ 30 марта 2012

Проблема теперь в том, что после ожидания около 2 часов без каких-либо соединений программа просто остановится без причины (без исключений).

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

  • Вы полностью уверены, что увидите строку вывода во всех catch всех?
  • Не могли бы вы исчерпать память или другие ресурсы?
  • Может ли какой-то брандмауэр операционной системы убить сокет неактивного сервера?

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

BufferedReader ois = new BufferedReader(
    new InputStreamReader(socket.getInputStream()));
BufferedWriter oos = new BufferedWriter(
    new OutputStreamWriter(socket.getOutputStream()));

Я бы рекомендовал сделать все это внутри клиентский поток.Просто передайте socket в ваш SocketHandler конструктор:

Thread socketT = new Thread(new SocketHandler(socket));

Затем запустите IO в run() методе socketT.

Еще одна вещь, которую стоит попробоватьне делать server.accept() с таймаутом 0, но установить его равным минуте или чему-то (60000) и поймать SocketTimeoutException, а затем выполнить цикл.Это не правильно делать в долгосрочной перспективе, но это может переместить проблему и раскрыть проблему лучше.

Наконец, ваша добыча Throwable в вашей внешней добыче.С точки зрения обработки ошибок, это грубая вещь, но пока вы не выясните это, у вас есть разрешение.: -)

...