我想使用 Java NIO API 中的数据报通道通过网络传输一个 int 数组。但是,读/写函数只能将 aByteBuffer
作为输入。所以我需要将 int 数据存储到 a 中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
是一个二维数组,它的每一行都会从网络接收一个数据包。
我读到getInt()
从 中读取 4 个字节ByteBuffer
并将当前位置移动 4 个字节。是不是我使用buffer.flip()
错误的方式。我是新手,NIO
并且在如何调试此类问题时遇到困难。
更新:
错误不再发生。但是现在接收者得到的都是零。而我在每个数据包中传输一个二进制序列。当我从发送方本身的缓冲区读回时,所有条目都正确显示,但接收方接收到的缓冲区全为零。不知道为什么会这样。
更新 2:
最后,经过几个小时的努力,问题得到了解决。当您收到缓冲区时,您需要将其倒回。
channel.receive(buffer);
buffer.rewind();
如果您现在对缓冲区使用 getInt 方法,您将能够成功读取缓冲区。