ByteBuffer get () операции - PullRequest
       16

ByteBuffer get () операции

0 голосов
/ 30 сентября 2018

Я работаю с 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.

Любая помощь?

...