java nio и проблема с байт-буфером

#java #sockets #nio #bytebuffer

#java #сокеты #nio #bytebuffer

Вопрос:

Я столкнулся с проблемой. Я использую сокет nio для получения сообщения. После получения полного сообщения я отправляю буфер данных, который содержит полученное сообщение, другому пользователю. Но ниже приведено исключение. В чем проблема? Я пытаюсь вызвать DataBuffer.duplicate() и записать его. Но на стороне получателя операция чтения выдает такое исключение. Я должен назначить новый ByteBuffer и создать новую копию сообщения и записать ее. В этом случае ошибки нет. Но я не хочу выполнять этап копирования. Есть ли какой-либо другой способ решить это?

Возникло исключение

 java.nio.BufferOverflowException
    at java.nio.HeapByteBuffer.put(Unknown Source)
    at java.nio.ByteBuffer.put(Unknown Source)
    at serviceHandlerPackage.ServiceHandler.readComplete(ServiceHandler.java:218)
  

Код

 readEventHAndler(SocketChannel socket) {
   readCompleteData(socket);
}

readCompleteData(Socket) {
    ByteBuffer dataBuffer; //hold complete message
    if(!dataComplete)  return;
    else   process(dataBuffer);
}

process(dataBuffer) {
   ...

   processHandler();

   sendNext(dataBuffer);

}


sendNext(dataBuffer) {
    write(dataBuffer);

}
  

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

1. пожалуйста, предоставьте соответствующий код.

2. плохое название вопроса… Я имею в виду, это не объясняет вашу проблему. вы предоставляете меньше кода, чем нам нужно, чтобы помочь вам решить вашу проблему. например, ваш буфер данных никогда не инициализируется…

Ответ №1:

Всякий раз, когда вы считываете данные в буфер, если вы хотите записать буфер из другого канала, вам нужно вызвать: buffer.flip() перед записью. Вам не нужно дублировать буфер, если вы пишете в том же потоке, что и читаете.

Также — BufferOverflowException означает, что вы помещаете в буфер больше данных, чем его емкость. Похоже, что буфер не вызывается buffer.clear() для сброса позиции к нулю.

Написанного выше кода недостаточно, чтобы точно определить, в чем проблема.

Ответ №2:

Ваша программа выдает исключение при вводе данных, поэтому я бы сказал, что что-то не так с позицией / пределом.

Похоже, вы пытаетесь поместить данные в буфер чтения или пытаетесь поместить больше данных, чем его размер. Буфер не будет расти сам по себе (для этого лучше использовать ByteArrayOutputStream).

Прочитайте об очистке, перемотке и переключении в документации Java. Это приведет к сбросу положения, ограничения или размера буфера.