在我的Java应用程序中,我通过DatagramSocket接收DatagramPacket。我知道数据包可以包含的最大字节数,但实际上每个数据包长度都不同(不超过最大长度)。
假设MAX_PACKET_LENGTH = 1024(字节)。因此,每次收到DatagramPacket时,它都是1024字节长,但并不总是所有字节都包含信息。可能会发生数据包有10个字节的有用数据,其余1014个字节用0x00填充。
我想知道是否有任何优雅的方法来修剪这个0x00(未使用的)字节,以便只传递给其他层有用的数据? (也许是一些java原生方法?进入循环并分析包含哪些包不是理想的解决方案:))
感谢所有提示。 彼得
答案 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();
}
}