我正在运行一个带有活动循环的线程,等待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中尽快处理数据报的数据包。
我似乎错过了什么。
任何想法都是最好的方式吗?!
答案 0 :(得分:1)
如果你赶时间,那么:
现在,每次数据包到达时,都会创建一个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);