0

クラス オブジェクトをバイト配列参照hereDatagramPacketに作成し、この配列をUDP 通信で宛先に送信するために渡します。宛先側では C アプリケーションが実行されており、有線文字を取得しています。これはバイトオーダーに関連していると確信しています。パケットの受信中に C の構造体をクラスに変換することはできますが、その逆はできないためです。以下はsudo - コードです:

// recieving part

DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet)
UdpPacket udp = new UdpPacket(buffer);

class UdpPacket implements Serializable
{
 int a;
 byte []message = new byte[10];

 public UdpPacket(byte[] data)
 {
    ByteBuffer bb = ByteBuffer.wrap(data);
    bb.order(ByteOrder.nativeOrder());
    a = bb.getInt();
    bb.get(message);
 }

}

// sending ..

上記のリンクに従ってUdpPacketオブジェクトをバイト配列に変換しますが、宛先には常にジャンク値があります

DatagramSocket clientSocket = new DatagramSocket();

byte [] respoBytes = ObjectSerializer.serializeObject(udpPacket);

ByteBuffer bb = ByteBuffer.wrap(respoBytes);


byte []test = new byte[1116];
bb.order(ByteOrder.nativeOrder()); // tried all the orders here
bb.get(test);
DatagramPacket sendPacket = new DatagramPacket(test,test.length,client, Integer.parseInt(TxtFdPort.getText().toString()));
clientSocket.send(sendPacket)

;

4

2 に答える 2

1

最も明らかな問題は、読み取ったデータの長さを無視することです。

DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);

ByteBuffer bb = ByteBuffer.wrap(packet.getData(), 0, packet.getLength());
// you need to know the endianess, not hope it's the same.
bb.order(ByteOrder.LITTLE_ENDIAN);
int a = bb.getInt(); // asuming there is at least 4 bytes.
byte[] message = new byte[bb.remaining()];
bb.get(message);

送信の場合、これを行うだけです。

int port = Integer.parseInt(TxtFdPort.getText().toString());
byte [] respoBytes = ObjectSerializer.serializeObject(udpPacket);
DatagramPacket sendPacket = new DatagramPacket(respoBytes, respoBytes.length, client, port);
clientSocket.send(sendPacket);
于 2013-01-03T12:09:22.057 に答える
0

送信前と受信後に一連のバイトを出力します。これにより、それらが同一であるかどうかがわかります。次に、たとえば an に対応するバイトを調べるintと、それらが正しい順序であるかどうかがすぐにわかります。

送信コードを表示していないため、より具体的にすることは困難です。

于 2013-01-03T12:08:15.700 に答える