Я работаю с NIO и буферами в проекте сервер-клиент.Я использую ByteBuffers для передачи данных на мои SocketChannels.Моя проблема возникает при попытке get
данных любого типа из буфера:
@Override
public void write(SocketChannel channel) {
byte[] locationBytes = this.location.getBytes();
System.out.println("writing locationBytes length: " + locationBytes.length); // it prints 9
BUF.clear();
BUF.putInt(locationBytes.length);
BUF.put(locationBytes);
BUF.flip();
try {
channel.write(BUF);
} catch (IOException e) {
e.printStackTrace();
}
BUF.flip();
}
@Override
public void read(SocketChannel channel) {
BUF.clear();
int bytesRead;
try {
bytesRead = channel.read(BUF);
} catch (IOException e) {
e.printStackTrace();
return;
}
BUF.rewind();
int locationBytesLength = BUF.getInt();
System.out.println("locationBytes length received: " + locationBytesLength); // it prints a big number
byte[] locationBytes = new byte[locationBytesLength];
BUF.get(locationBytes); // BufferUnderflowException, meaning that all the remaining data was read as a single int above
}
Как указано в комментариях, на стороне клиента он печатает правильную длину переменной locationBytes
,но на стороне сервера выглядит, что он преобразует все оставшиеся байты в один int.Поэтому, выбрасывая BufferUnferflowException
при попытке get
любых данных после вызова getInt
.
Любая помощь?