загрузка файла java NIO, потеря пакетов

#java

#java

Вопрос:

Сначала код

 ByteBuffer readBuffer = ByteBuffer.allocate(requestSize);// here is 1024*1024*1024 = 1G
readBuffer.clear();

SocketChannel socketChannel = (SocketChannel) selectionKey.channel();

while (socketChannel.read(readBuffer)> 0) {}

/* Get request message */
readBuffer.flip();
byte[] bytes = new byte[readBuffer.limit()];
readBuffer.get(bytes);
 

Как показано в приведенном выше коде, емкость буфера ByteBuffer установлена на 1G, но загрузка файла размером около 30M часто приводит к потере пакетов, что приводит к неполным файлам, а затем сообщается об ошибке во время синтаксического анализа FormData.

Если емкость этого буфера намного больше, чем файла, проблем вообще нет, но я не могу установить слишком большой буфер, иначе куча переполнится.

Пожалуйста, дайте указания тем, кто знаком с NIO

Комментарии:

1. Попробуйте изменить > 0 на >= 0 . Только отрицательное возвращаемое значение указывает на конец потока. Смотрите документацию по read методу .

2. Спасибо, но если его изменить на >= 0, он попадает в бесконечный цикл. Вы никогда не сможете закончить чтение. Только если вы отмените этот запрос, он станет -1

3. Разве клиент не прекращает отправку и не закрывает соединение, когда файл полностью загружен?

4. Нет, клиенту нужно дождаться ответа, потому что я разрабатываю http-сервис на основе NIO

5. 1 ГБ намного больше, чем 30 МБ. 30 МБ — это всего 3% от 1 ГБ. Насколько больше это должно быть? Я думаю, что проблема в чем-то другом.