3

私の Java アプリでは、DatagramSocket を介して DatagramPacket を受け取ります。パケットに含めることができる最大バイト数はわかっていますが、実際にはすべてのパケット長が異なります (最大長を超えない)。

MAX_PACKET_LENGTH = 1024 (バ​​イト) と仮定しましょう。そのため、DatagramPacket を受信するたびに 1024 バイトの長さになりますが、すべてのバイトに情報が含まれているとは限りません。パケットに 10 バイトの有用なデータがあり、残りの 1014 バイトが 0x00 で埋められる場合があります。

有用なデータのみを他のレイヤーに渡すために、この 0x00 (未使用) バイトをトリミングするエレガントな方法があるかどうか疑問に思っています。(おそらくいくつかのJavaネイティブメソッド?ループに入り、パケットに含まれるものを分析することは、望ましい解決策ではありません:))

すべてのヒントをありがとう。ピーター

4

2 に答える 2

1

DatagramPacket で getLength を呼び出して、パケットの実際の長さを返すことができます。これは、MAX_PACKET_LENGTH よりも小さい場合があります。

于 2011-01-22T18:27:22.573 に答える
0

これは質問には遅すぎますが、私のような人には役立つかもしれません.

   private int bufferSize = 1024;
/**
 * Sending the reply. 
 */
public void sendReply() {
    DatagramPacket qPacket = null;
    DatagramPacket reply = null;
    int port = 8002;
    try {
        // Send reply.
        if (qPacket != null) {
            byte[] tmpBuffer = new byte[bufferSize];
                            System.arraycopy(buffer, 0, tmpBuffer, 0, bufferSize);
            reply = new DatagramPacket(tmpBuffer, tmpBuffer.length,
                    qPacket.getAddress(), port);
            socket.send(reply);

        }

    }  catch (Exception e) {
        logger.error(" Could not able to recieve packet."
                + e.fillInStackTrace());

    }
}
/**
 * Receives the UDP ping request. 
 */
public void recievePacket() {
    DatagramPacket dPacket = null;
    byte[] buf = new byte[bufferSize];
    try {

        while (true) {
            dPacket = new DatagramPacket(buf, buf.length);
            socket.receive(dPacket);
            // This is a global variable.
            bufferSize = dPacket.getLength();

            sendReply();

        }

    } catch (Exception e) {
        logger.error(" Could not able to recieve packet." + e.fillInStackTrace());
    } finally {
        if (socket != null)
            socket.close();
    }
}
于 2014-03-13T10:13:33.913 に答える