#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 ГБ. Насколько больше это должно быть? Я думаю, что проблема в чем-то другом.