3

JavaNIOAPIのデータグラムチャネルを使用してネットワーク経由でint配列を送信したい。ByteBufferただし、関数の読み取り/書き込みは、入力としてのみ取ることができます。したがって、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が個別のデータパケットとして扱われる2D配列です。

レシーバー側

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配列であり、その各行はネットワークから1つのパケットを受信します。

getInt()から4バイトを読み取りByteBuffer、現在の位置を4バイト移動することを読みました。buffer.flip()間違った使い方をしているのでしょうか。私は使用するNIOのが初めてで、そのような問題のデバッグに取り掛かるのに苦労しています。

アップデート:

エラーは発生しなくなりました。しかし、Receiverが取得するのはすべてゼロです。一方、私は各パケットでバイナリシーケンスを送信しています。送信者側のバッファから読み戻すと、すべてのエントリが正しく表示されますが、受信者側で受信したバッファはすべてゼロになります。なぜこれが起こっているのか分かりません。

更新2:

最後に、何時間も苦労した後、問題は修正されました。バッファを受け取ったら、巻き戻す必要があります。

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

バッファでgetIntメソッドを使用すると、バッファを正常に読み取ることができます。

4

1 に答える 1

6

書き込みから読み取りへ、および読み取りから書き込みへスワップするたびに、flip()があります。次の2番目の例にflip()を追加しますreceive()

これが機能するようになったら、ByteBufferとEJPの提案を再利用する方法を確認する必要があります。

于 2012-11-14T09:07:21.403 に答える