2012-05-23 3 views
0

Я запускаю 2 потока в своем приложении. Один для проверки входящих пакетов и один для обработки и отправки пакетов. Они оба делают это на ОДНОМ ПОТОКЕ.Java EOFException Сервер/Клиент TCP-приложение

Пример 1:

while (connection open) { 
    in.readObject() instanceof ... 
} 

Пример 2:

while (connection open) { 
    processPacket(in) 
} 

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

Если это проблема, то кто-нибудь знает, как ее синхронизировать, чтобы сделать это за другим, сохраняя при этом текущую скорость обновления и используя два потока?

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

Как исправить исключение EOF?

ответ

1

Если вы получаете EOFException, это обычно означает, что другая сторона повесила трубку. Обычно вы получаете их на стороне чтения.

Вот аналогичный SO question

Edit 1: Вопрос действительно почему закрыт сокет. Это может быть по любому ряду причин, программируемый таймер на стороне сервера, проверяющий отсутствие данных в течение X минут, брандмауэр, закрывающий соединение, прерывание сети и т. Д.

+0

nvm исправлено это спасибо – Trixmix

1

Оба потока не должны читать одинаковые Поток.

Вы должны прочитать объекты и поместить их в ConcurrentLinkedQueue, а затем со второго потока вы можете проверить очередь на объекты, готовые к обработке.

1

EOFException является «нормальным». Это происходит и в одном потоке. Ваша архитектура чтения в двух потоках одновременно не может работать, но это не является причиной этой проблемы. Причина в том, что сверстник закрыл соединение. Это произойдет. Если ваш протокол приложения содержит количество сообщений или закрытое уведомление или какие-либо другие средства прогнозирования EOS, он получит EOFExceptions или readLine(), возвращающий null, или read(), возвращающий -1, в зависимости от того, какие методы чтения вы вызываете.

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