0

我正在运行一个带有等待 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 条日志文本消息“测试”!

因此,似乎 Android 的 VM 将所有数据包保存在缓冲区中的某个位置,并在可能的情况下对其进行处理!

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

看来我错过了什么。

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

4

2 回答 2

1

如果你赶时间,那么:

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

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

于 2012-04-27T18:47:32.303 回答
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);
于 2016-01-30T13:07:42.863 回答