Контракт DataInput.readUTF () заключается в том, что длина строки для чтения содержится в первых двух байтах:
First, twoбайты считываются и используются для создания 16-разрядного целого без знака точно так же, как метод readUnsignedShort. Это целочисленное значение называется длиной UTF и определяет количество дополнительных байтов, которые нужно прочитать .
Если ваш другой инструмент не кодирует строку данных UTF точно таким же образом, вполне вероятно, что ваш сервер неверно интерпретирует первые байты отправленных данных как длину данных для чтенияи просто зависайте в ожидании поступления оставшихся данных.
Например, предположим, что ваш инструмент отправляет строку «Hello World», закодированную в ASCII .В шестнадцатеричном формате это
48 65 6C 6C 6F 20 57 6F 72 6C 64
Ваш сервер получает данные, и класс DataInput начинает декодировать их как UTF8 в соответствии с контрактом.Первые два байта читаются как короткие без знака:
utf_length = (((48 & 0xff) << 8) | (65 & 0xff))
Это дает длину 18533 байтов.После считывания оставшихся 9 байтов потока сервер просто заблокирует ожидание поступления оставшихся 18524 байтов, как это и ожидается.Я думаю, это причина, по которой ваша программа просто зависает.
Поскольку вы не говорите, что такое клиентский инструмент или как он кодирует данные, которые вы читаете, трудно понять, является ли это причинойили нет.
Если это неправильный ответ, обновите ваш вопрос, добавив дополнительную информацию или даже некоторые тестовые данные, которые могут помочь будущим посетителям.