9

我正在尝试通过 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 尽可能快地响应,而不需要在整个网络中抛出无用的数据。那么,有没有更优雅的解决方案呢?

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

谢谢你的帮助!

4

1 回答 1

3

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

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


谢谢,我现在实现了仅当在此期间没有发送其他数据包时才发送这些保活数据包。

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

除此之外,将数据包发送到另一个没有人在监听的端口会更快吗?它应该仍然具有相同的效果,对吧?

不太可能有任何区别。没有证据表明问题是由拥堵引起的。证据表明您的手机关闭了不活动的 WiFi 以节省电量......

于 2012-11-26T04:50:52.280 回答