Android UDP数据报数据包接收环路延迟

Android UDP数据报数据包接收环路延迟,android,Android,我正在运行一个线程,其中有一个活动循环在等待UDP数据包 当收到消息时,我想处理它 我需要每秒接收几个数据包(~20) 我举了一个最简单的例子,就是在收到UDP数据包后进行日志记录 while (socketUDP != null) { message = new byte[6]; packet = new DatagramPacket(message, message.length); try { socketUDP.receive(packet);

我正在运行一个线程,其中有一个活动循环在等待UDP数据包

当收到消息时,我想处理它

我需要每秒接收几个数据包(~20)

我举了一个最简单的例子,就是在收到UDP数据包后进行日志记录

while (socketUDP != null) {
    message = new byte[6];
    packet = new DatagramPacket(message, message.length);

    try {
        socketUDP.receive(packet);
        command = new String (message, 0, packet.getLength());
    } catch (IOException e) {
        Log.e(LOG_TAG, LOG_TAG + " IOException: " + e.getMessage() );
    }

    Log.d(LOG_TAG, "test");
}
这种行为很奇怪,因为,例如,我在1秒内发送了50个UDP数据包,没有人丢失,而Android需要大约3/4秒来显示50个日志文本消息“test”

所以,Android的虚拟机似乎将所有数据包都保存在一个缓冲区中,并在可能的情况下进行处理

我需要在Android中尽快处理数据报的数据包

我好像错过了什么


有什么想法是最好的方法吗

如果您赶时间,那么:

  • 在侦听UDP之前创建所有对象
  • 在您接收完所有数据包后进行日志记录,或者至少记录少量数据包,并且不经常记录

现在,每次数据包到达时,您都会创建一个DatagramPacket和一个字符串,然后创建Log.e,所有这些都比接收数据包本身要花费更多的时间。当然,即使经过优化,也无法保证传输的实时性。

尝试ping发送数据包的设备。这对我有帮助。例如,我在接收数据包之前使用以下代码:

pingThread = new Thread(new Runnable() {
        @Override
        public void run() {
            Runtime runtime = Runtime.getRuntime();
            try {
                // Ping 10 times at 169.254.169.168
                runtime.exec("/system/bin/ping -c 10 169.254.169.168");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });
    pingThread.start();
之后,您可以拨打:

socketUDP.receive(packet);

有时更新日志也很费时,所以不确定引用的时间。第二,我建议记录接收次数。每秒只接收20或50个包,你到底有什么问题/奇怪的行为?是的,底层网络硬件和软件会做一些缓冲,我需要在收到数据包后立即处理数据包。例如,doSomething(消息);Log.d只是一个例子。@zapi问题是,我想在收到消息时处理它,这需要一段时间,延迟行为。是的,我想最小化缓冲。