UDP数据报包接收循环延迟

时间:2012-04-27 18:26:24

标签: android

我正在运行一个带有活动循环的线程,等待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的VM正在将所有数据包保存在缓冲区并尽可能处理它!

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

我似乎错过了什么。

任何想法都是最好的方式吗?!

2 个答案:

答案 0 :(得分:1)

如果你赶时间,那么:

  • 在收听UDP之前创建所有对象
  • 在您收到所有数据包后记录,或者至少记录一小部分数据,并且不经常。

现在,每次数据包到达时,都会创建一个DatagramPacket和一个String,然后是Log.e,所有这些都比接收数据包本身要花费更多的时间。当然,即使经过优化,也没有实时的交付保证。

答案 1 :(得分:0)

尝试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);