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メソッドを使用すると、バッファを正常に読み取ることができます。