java nio и проблема с ByteBuffer - PullRequest
1 голос
/ 01 июня 2011

Я столкнулся с проблемой.Я использую сокет nio для получения сообщения.После получения полного сообщения я отправляю dataBuffer, который содержит полученное сообщение другому пользователю.Но есть исключение ниже.В чем проблема?Я пытаюсь вызвать 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);

}

Ответы [ 2 ]

2 голосов
/ 19 июня 2012

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

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

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

1 голос
/ 02 июня 2011

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

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

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

...