#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. Это приведет к сбросу положения, ограничения или размера буфера.