Android UDP数据报数据包接收环路延迟
我正在运行一个线程,其中有一个活动循环在等待UDP数据包 当收到消息时,我想处理它 我需要每秒接收几个数据包(~20) 我举了一个最简单的例子,就是在收到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);
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问题是,我想在收到消息时处理它,这需要一段时间,延迟行为。是的,我想最小化缓冲。