EOFException
не выдается, пока сокет не закроется.
Этот метод должен блокироваться при попытке прочитать больше данных, чем доступно. Он возвращает EOFException только тогда, когда сокет закрывается, так как это фактическое условие EOF. Если сокет остается открытым, он блокируется, пока не будет достаточно данных для выполнения запроса.
Это часть фундаментальной природы работы сокетов. Чтобы Java вел себя по-другому, ему пришлось бы неправильно реализовывать поведение сокета.
При составлении протокола сокета вы должны учитывать это. Почему вы ждете получения int, и отправляется только часть int? Этого никогда не должно случиться. Если вы хотите отправлять различные типы данных, вы должны сначала включить какой-нибудь байт заголовка, чтобы сообщить получателю, какие данные будут поступать дальше, чтобы он знал, как их обрабатывать и что с ними делать.