java - 强制android立即发送UDP数据包?

标签 java android udp ping latency

我正在尝试通过 WiFi 将我的 Galaxy Ace 连接到我的笔记本电脑。两个设备都通过 WiFi 连接到路由器,并且双方都使用 Java。

在 TCP 连接不时给我非常高的 ping 后,我决定基于 UDP 连接,以便能够控制数据包实际发送的时间。

但是,Android 似乎仍在缓冲 UDP 数据包并且不会立即发送它们。如果在几分之一秒内没有传出数据传输,这或者它会完全关闭 WiFi。

首先,我以大约每秒一次的不规则间隔 ping 电话,重复发送 ping 请求,只要没有收到答复(包括 UDP 中的数据包丢失):

    computer -> phone -> computer
    Pinging 192.168.1.40: 148.05968ms
    Pinging 192.168.1.40: 524.41156ms
    Pinging 192.168.1.40: 705.8688ms
    Pinging 192.168.1.40: 3.705367ms
    Pinging 192.168.1.40: 3.872159ms
    Pinging 192.168.1.40: 549.4541ms
    Pinging 192.168.1.40: 479.29843ms
    Pinging 192.168.1.40: 3.89936ms
    Pinging 192.168.1.40: 428.85876ms
    Pinging 192.168.1.40: 739.28125ms

我解决了这个问题,方法是每 100 毫秒从手机向计算机发送数据包,仅包含 1 个字节的数据,除此之外没有对例程进行任何更改:

    computer -> phone -> computer
    Pinging 192.168.1.40: 4.147753ms
    Pinging 192.168.1.40: 3.738213ms
    Pinging 192.168.1.40: 14.133768ms
    Pinging 192.168.1.40: 4.470561ms
    Pinging 192.168.1.40: 3.628386ms
    Pinging 192.168.1.40: 3.898334ms
    Pinging 192.168.1.40: 3.512401ms
    Pinging 192.168.1.40: 7.907006ms
    Pinging 192.168.1.40: 5.234216ms
    Pinging 192.168.1.40: 5.639137ms

低延迟对我的应用程序至关重要,因此我会像这样继续发送空数据包(至少只要没有传输实际数据)。我想知道,我是否可以强制 android 尽可能快地响应,而无需在整个网络中抛出无用数据。那么,有没有更优雅的解决方案呢?

顺便说一句,我假设问题出在智能手机上,而不是计算机上,尽管它也可能是计算机在等待传入数据包然后发送数据包。不过,据我对网络的了解,这不太可能。

感谢您的帮助!

最佳答案

就 Java 而言,一旦调用了 DatagramSockect.send(...),数据报就被“发送”了。 Java 应用程序空间中没有缓冲,也无法控制操作系统中的任何缓冲。

TCP 或 UDP 不太可能“阻止”数据包。根本问题更有可能出在 WiFi 级别……或者可能与路由有关……并且操作系统会延迟发送数据包,直到问题自行解决。


Thanks, I now implemented sending those keep-alive packets only if there was no other packet sent during that time.

听起来你的 keep-alive ping 正在产生预期的效果......据此我推断根本问题是/是 WiFi“链接”由于不活动而被丢弃。 (这听起来像是“不要耗尽电池”功能......)这表明另一种解决方法是查看是否可以调整 WiFi 超时。

Besides that, would it be faster to send packets to another port, on which nobody is listening? It should still have the same effect without, right?

不太可能产生任何影响。没有证据表明问题是由拥塞引起的。证据表明您的手机会关闭不活动的 WiFi 以节省电量...

关于java - 强制android立即发送UDP数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13558283/

相关文章:

java - Freemarker 中的继承/实例检查

java - 集合的依赖注入(inject)

android - Android 在哪里保存在平板电脑上运行的应用程序的 SqliteDB?

android - 在android设备中接收UDP广播时丢包

c++ - 以高数据包速率最小化丢弃的 UDP 数据包 (Windows 10)

go - 绑定(bind) : cannot assign requested address on UDPclient in local network

java - Thymeleaf 不使用 spring mvc 渲染

java - 带有 Hibernate 的 Spring JPA : How to verify that an object was saved?

java - 如何使警报对话框按 Java 中的位置显示字符串中的项目?

java - 安卓应用程序 : Cannot pass method from another class into the main class