Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.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_Android_Udp - Fatal编程技术网

Java 快速接收UDP数据包

Java 快速接收UDP数据包,java,android,udp,Java,Android,Udp,我有一个UDP侦听器线程,它是循环的,在收到数据包后调用一个方法。它工作得很好,只是当多个数据包在第一个数据包之后很快到达时,该方法没有被调用 两个数据包一次接一次地发送,第一个数据包长2字节,第二个数据包长3字节。 接收方法通常在第二个数据包到达时触发 以下是UDP侦听器类: public class UDPListener extends Thread{ private boolean running = true; byte[] data = new byte[1500];

我有一个UDP侦听器线程,它是循环的,在收到数据包后调用一个方法。它工作得很好,只是当多个数据包在第一个数据包之后很快到达时,该方法没有被调用

两个数据包一次接一次地发送,第一个数据包长2字节,第二个数据包长3字节。 接收方法通常在第二个数据包到达时触发

以下是UDP侦听器类:

public class UDPListener extends Thread{
    private boolean running = true;
    byte[] data = new byte[1500];
    DatagramPacket packet = new DatagramPacket(data, data.length);

    public void run() {
        Log.v("MR", "Runs");
        try {
            while(running) {
                Log.v("MR", "Listening... ");

                socket.receive(packet);
                Log.v("MR", "Received Data: " + packet.getData()[0] + "; Length: " + packet.getLength());

                device.post(new Runnable() {
                    public void run() {
                        device.receive(packet.getData(), packet.getData().length);                           
                    }
                });

            }
        } catch (Throwable e) {
            e.printStackTrace();
            Log.v("MR", "Failed receiving");
        }

    }
}
以下是device.receive方法:

public final void receive(byte[] inData, int length) {
    data = inData;
    dataLength = length;
    Log.v("MR", "Receive(): Data: +" + data[0] + "; Length: " + String.valueOf(data.length));
}
以下是日志结果的一部分:

10-18 17:24:34.393  Received Data: 79; Length: 3
10-18 17:24:34.393  Listening...
10-18 17:24:34.393  Receive(): Data: +79; Length: 1500
10-18 17:24:34.393  Receive(): Data: +79; Length: 1500
10-18 17:24:34.413  Received Data: 6; Length: 2
10-18 17:24:34.413  Listening...
10-18 17:24:34.413  Received Data: 79; Length: 3
10-18 17:24:34.413  Listening...
10-18 17:24:34.413  Receive(): Data: +79; Length: 1500
10-18 17:24:34.413  Receive(): Data: +79; Length: 1500
10-18 17:24:34.423  Received Data: 6; Length: 2
10-18 17:24:34.423  Listening...
正如可以看到的那样,数据包实际上是传入的,对于第二个长度,just receive被调用的频率更高:3个数据包

“设备”是一个自定义视图,具有接收方法。 我还尝试了handler和rununuithread,结果相同。 我假设UI线程不能更新得这么快或类似的东西


另外,为什么线程日志中的数据包具有实际长度,而恢复日志中的数据包具有1500字节?它应该是传递的同一个数据包。

我看到这个问题有80多个视图。解决方案是使用处理程序向UI发送消息,并在新数据包到来之前重新初始化data[]数组和DatagramPacket

工作守则是:

public static class UDPListener extends Thread{
        private boolean running = true;
        Message msg;
        byte[] data;
        DatagramPacket packet;

        public void run() {
            try {
                while(running) {
                    data = new byte[1500];
                    packet = new DatagramPacket(data, data.length);

                    //Blocks and waits for a packet
                    socket.receive(packet);

                    //Send packet message to UI
                    msg = UDPReceiveHandler.obtainMessage();
                    msg.obj = packet;
                    UDPReceiveHandler.sendMessage(msg);

                }
            } catch (Throwable e) {
                e.printStackTrace();
            }
        }
    }