java udp检测数据包损坏

问题描述:

如何检测java中的udp数据包损坏?java udp检测数据包损坏

public class PacketReceiver implements Runnable{ 
byte[] dataReceive = new byte[udpConnectionManager.MAX_PACKET_SIZE]; 
private ArrayList<Thread> workerList = new ArrayList<Thread>(); 
@Override 
public void run() { 
    while(true){ 
     DatagramPacket receivePacket = new DatagramPacket(dataReceive, dataReceive.length); 
     try { 
      udpConnectionManager.socket.receive(receivePacket); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     byte[] receivedData = receivePacket.getData(); 
     //[0] stores basic command 
     //[1~4] int stores protocol id 
     //[5~9] int data increase counter for detect packet loss 
     //[10~14] 
     switch(receivedData[0]){ 
     //initial packet 
     case 0x01: 
      if(!udpConnectionManager.instance.isInitialized(receivePacket)){ 
       Thread t = new Thread(new AcceptThread(receivePacket)); 
       t.start(); 
       workerList.add(t); 
      }else{ 
       System.out.println("initialized packet attempt to initialize."); 
      } 
     //heartbeat signal 
     case 0x02: 
      if(udpConnectionManager.instance.isInitialized(receivePacket)){ 
       udpConnectionManager.instance.getConnection(receivePacket).onHeartBeat(); 
      }else{ 
       System.out.println("Received HeartBeat signal from non-initialized connection"); 
      } 
     // 
     case 0x03: 

     } 
    } 
} 

}

数据包损坏可能会发生。我该如何处理使用udp的数据包损坏问题? 和我知道如何检测数据包丢失,但我不知道如何检测数据包损坏。

如果您绝对只需要使用DatagramPacket - 那么它不会公开任何API来查询传输的校验和。作为一种解决方案,您可以实现一个逻辑(SHA256,MD ..)来计算校验和,在交替的UDP数据包中将校验和作为有效载荷进行传输,并比较数据有效载荷上计算的校验和与下一次接收的校验和UDP段。当然,您需要在建议的解决方案中处理更多的错误条件。