Обрезка 0x00 в полученном DatagramPacket - PullRequest
3 голосов
/ 22 января 2011

В моем приложении Java я получаю DatagramPacket (s) через DatagramSocket. Я знаю максимальное количество байтов, которое может содержать пакет, но на самом деле длина каждого пакета меняется (не превышает максимальную длину).

Предположим, что MAX_PACKET_LENGTH = 1024 (байт). Таким образом, каждый раз, когда принимается DatagramPacket, он имеет длину 1024 байта, но не всегда все байты содержат информацию. Может случиться, что пакет содержит 10 байтов полезных данных, а остальные 1014 байтов заполнены 0x00.

Мне интересно, есть ли какой-нибудь элегантный способ обрезать эти 0x00 (неиспользуемые) байты, чтобы передать на другой слой только полезные данные? (может быть, некоторые нативные Java-методы? Зацикливание и анализ того, что содержит пакет, не является желаемым решением:))

Спасибо за все подсказки. Петр

Ответы [ 2 ]

1 голос
/ 22 января 2011

Вы можете вызвать getLength для DatagramPacket, чтобы вернуть АКТУАЛЬНУЮ длину пакета, которая может быть меньше, чем MAX_PACKET_LENGTH.

0 голосов
/ 13 марта 2014

Это слишком поздно для вопроса, но может быть полезно для таких людей, как я.

   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();
    }
}
...