在收到的DatagramPacket中修整0x00

时间:2011-01-22 18:04:14

标签: trim datagram

在我的Java应用程序中,我通过DatagramSocket接收DatagramPacket。我知道数据包可以包含的最大字节数,但实际上每个数据包长度都不同(不超过最大长度)。

假设MAX_PACKET_LENGTH = 1024(字节)。因此,每次收到DatagramPacket时,它都是1024字节长,但并不总是所有字节都包含信息。可能会发生数据包有10个字节的有用数据,其余1014个字节用0x00填充。

我想知道是否有任何优雅的方法来修剪这个0x00(未使用的)字节,以便只传递给其他层有用的数据? (也许是一些java原生方法?进入循环并分析包含哪些包不是理想的解决方案:))

感谢所有提示。 彼得

2 个答案:

答案 0 :(得分:1)

您可以在DatagramPacket上调用getLength来返回数据包的ACTUAL长度,该长度可能小于MAX_PACKET_LENGTH。

答案 1 :(得分: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();
    }
}