Я хочу передать массив int по сети с помощью канала датаграммы в Java NIO API. Однако функции чтения / записи могут принимать только ByteBuffer
в качестве входных данных. Поэтому мне нужно сохранить данные типа int в ByteBuffer
, а затем прочитать их в приемнике. Я столкнулся с java.nio.BufferUnderflowException
. Вот что я делаю на стороне отправителя:
for(i = 0; i < send_data.length; i++)
{
//Write the data onto Buffer
ByteBuffer buffer1 = ByteBuffer.allocate(send_data[i].length*4);
for(j = 0; j < send_data[i].length; j++)
buffer1.putInt(send_data[i][j]);
buffer1.flip();
//Transmit the data
while(buffer1.hasRemaining())
channel.write(buffer1);
}
Здесь send_data
- это двумерный массив, в котором каждая строка обрабатывается как отдельный пакет данных.
На стороне получателя
for(i = 0; i < k; i++)
{
ByteBuffer buffer = ByteBuffer.allocate((recvpkt[0].length)*4);
channel.receive(buffer);
j = 0;
while(buffer.hasRemaining())
{
recvpkt[i][j] = buffer.getInt();
j = j+1;
}
}
Точно так же recvpkt
- это 2D-массив, и каждая его строка будет получать по одному пакету из сети.
Я читал, что getInt()
читает 4 байта из ByteBuffer
и перемещает текущую позицию на 4 байта. Я неправильно использую buffer.flip()
. Я новичок в использовании NIO
, и у меня возникли трудности с отладкой таких проблем.
ОБНОВИТЬ:
Ошибка больше не возникает. Но теперь все, что получает Приемник, - это все нули. В то время как я передаю двоичную последовательность в каждом пакете. Когда я считываю обратно из буфера на самой стороне отправителя, все записи появляются правильно, но буфер, полученный на стороне получателя, имеет все нули. Понятия не имею, почему это происходит.
ОБНОВЛЕНИЕ 2:
Наконец, после нескольких часов борьбы проблема решена. При получении буфера нужно его перемотать.
channel.receive(buffer);
buffer.rewind();
Если вы теперь используете метод getInt в буфере, вы сможете успешно прочитать буфер.