Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java udp检测数据包损坏_Java_Udp - Fatal编程技术网

java udp检测数据包损坏

java udp检测数据包损坏,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() { whi

如何在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:

        }
    }
}
public类PacketReceiver实现可运行{
字节[]数据接收=新字节[udpConnectionManager.MAX_PACKET_SIZE];
private ArrayList workerList=新建ArrayList();
@凌驾
公开募捐{
while(true){
DatagramPacket receivePacket=新的DatagramPacket(dataReceive,dataReceive.length);
试一试{
udpConnectionManager.socket.receive(receivePacket);
}捕获(IOE异常){
e、 printStackTrace();
}
字节[]receivedData=receivePacket.getData();
//[0]存储基本命令
//[1~4]int存储协议id
//[5~9]用于检测丢包的int数据增加计数器
//[10~14] 
开关(接收数据[0]){
//初始数据包
案例0x01:
如果(!udpConnectionManager.instance.isInitialized(receivePacket)){
线程t=新线程(新接受线程(接收包));
t、 start();
工作列表。添加(t);
}否则{
System.out.println(“初始化的数据包尝试初始化”);
}
//心跳信号
案例0x02:
if(udpConnectionManager.instance.isInitialized(receivePacket)){
udpConnectionManager.instance.getConnection(receivePacket.onHeartBeat();
}否则{
System.out.println(“从未初始化的连接接收到的心跳信号”);
}
//
案例0x03:
}
}
}
}

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

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