Java 在一个线程中定期发送许多UDP数据报有时会导致微包突发

Java 在一个线程中定期发送许多UDP数据报有时会导致微包突发,java,android,udp,datagram,Java,Android,Udp,Datagram,我们正在尝试通过Wifi向服务器发送Android 7.0中的UDP数据报。 数据报大小为23字节,频率约为15毫秒 我们有一个排着长队的队伍。另一个发送线程从threadsafe队列中提取这些数组,并通过Datagramsocket将它们以数据报的形式发送到服务器。socket.send()方法每10-18毫秒调用一次 服务器端的Wireshark以大约15毫秒的固定稳定间隔接收大部分数据包,但有时(主要是每150-300个数据包)会有1-3个发送周期的延迟,然后延迟的数据包在暂停30-60毫

我们正在尝试通过Wifi向服务器发送Android 7.0中的UDP数据报。 数据报大小为23字节,频率约为15毫秒

我们有一个排着长队的队伍。另一个发送线程从threadsafe队列中提取这些数组,并通过Datagramsocket将它们以数据报的形式发送到服务器。socket.send()方法每10-18毫秒调用一次

服务器端的Wireshark以大约15毫秒的固定稳定间隔接收大部分数据包,但有时(主要是每150-300个数据包)会有1-3个发送周期的延迟,然后延迟的数据包在暂停30-60毫秒后以“突发”方式到达

如果在运行时我们试图通过网络密集型任务(当我们启动WiFi Analyzer应用程序时)对android手机施加压力,那么延迟会变得更长,出现的频率也会明显更高

增加发送方线程的线程优先级似乎对问题没有任何影响


如果有人能给我一些提示,告诉我如何更好地控制networkinterface发送过程,以减少突发事件并获得更稳定的定期发送间隔,我和我的同事们将非常感谢。

好的。我们发现了。如果我没记错的话,这些问题是由背景中的一些标准服务(如蓝牙)引起的(可能也是Wifi或GPS,正确地记住这些是很久以前的事了)。该服务每隔几秒钟就要查找信号及其强度,这样会中断我们的数据包管道。

首先,您需要确定它是源于发送端还是接收端。每15毫秒写入字节不仅仅是密集的。为什么不直接发送呢?@EJP我认为它起源于android端,因为我们正在一个纯粹的私有wifi网络中测试,服务器端的计算机只是运行一个脚本来接收数据包&没有其他东西,他的wireshark捕获应该非常可靠地显示正确的时间戳(正如我强烈地假设的——或者我的假设可能是错误的?。@Mạ新罕布什尔州奎伊ế唐古伊ễ请原谅,我需要更多的解释-它以什么方式强烈?你是什么意思直接发送它?我想我这样做已经是直接发送了