使用Java NIO中的ByteBuffer读写Int

时间:2012-11-14 09:02:42

标签: java networking nio bytebuffer data-conversion

我想使用Java NIO API中的数据报通道在网络上传输一个int数组。但是,函数读/写只能将ByteBuffer作为输入。所以我需要将int数据存储到ByteBuffer,然后在接收器处读回。我正面对java.nio.BufferUnderflowException。以下是我在Sender Side所做的事情:

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()ByteBuffer读取4个字节,并将当前位置移动4个字节。我是以错误的方式使用buffer.flip()吗?我是使用NIO的新手,我很难解决这些问题。

更新:

错误不再发生。但现在接收器获得的全部都是零。而我在每个数据包中传输二进制序列。当我从发送方本身的缓冲区读回来时,所有条目都正确,但接收方接收的缓冲区全部为零。不知道为什么会这样。

更新2:

最后,经过几个小时的挣扎,问题得到解决。当你收到缓冲区时,你需要倒回它。

  channel.receive(buffer);
  buffer.rewind();

如果你现在在缓冲区上使用getInt方法,你将能够成功读取缓冲区。

1 个答案:

答案 0 :(得分:3)

每次从写入到读取以及从读取到写入交换时,都有flip()缓冲区。在receive()

之后将flip()添加到第二个示例

一旦你完成这项工作,你应该看看如何重复使用你的ByteBuffers和EJP建议。