Проблема теперь в том, что после ожидания около 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
в вашей внешней добыче.С точки зрения обработки ошибок, это грубая вещь, но пока вы не выясните это, у вас есть разрешение.: -)