Mar*_*ius 8 java android udp latency ping
我正在尝试通过WiFi将我的Galaxy Ace连接到我的笔记本电脑.两台设备都通过WiFi连接到路由器,双方都使用Java.
在TCP连接不时给我很高的ping后,我决定将连接建立在UDP上,以便能够控制数据包实际发送的时间.
但是,似乎Android仍然会缓冲UDP数据包并且不会立即发送它们.如果在几分之一秒内没有传输的传出数据,这或者完全关闭WiFi.
首先,只要没有收到应答(覆盖UDP中的数据包丢失),我就会以不规则的间隔大约每秒一次地ping通电话,反复发送ping请求:
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
Run Code Online (Sandbox Code Playgroud)
我通过从手机发送数据包到每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
Run Code Online (Sandbox Code Playgroud)
对我的应用程序来说至关重要的是低延迟,所以我会像这样继续发送空数据包(至少只要没有真正的数据传输).我想知道,如果我可以强制android尽快响应,而不需要在网络上扔掉无用的数据.那么,有更优雅的解决方案吗?
顺便说一句,我假设问题是智能手机,而不是计算机,虽然它也可能是计算机等待传入的数据包然后发送其数据包.根据我对网络的了解,这是不太可能的.
谢谢你的帮助!
就 Java 而言,一旦调用了 DatagramSockect.send(...),数据报就被“发送”了。Java 应用程序空间中没有缓冲,也无法控制操作系统中的任何缓冲。
TCP 或 UDP 不太可能“阻止”数据包。根本问题更有可能是 WiFi 级别的问题……或者可能是路由问题……并且操作系统正在延迟发送数据包,直到问题自行解决。
谢谢,我现在实现了仅当在那段时间没有发送其他数据包时才发送这些保持活动数据包。
听起来你的 keep-alive ping 已经达到了预期的效果……据此我推断根本问题是 WiFi“链接”由于不活动而被丢弃。(这听起来像是一个“不耗尽电池”的功能......)这表明另一种解决方法是看看是否可以调整 WiFi 超时。
除此之外,将数据包发送到另一个没有人监听的端口会更快吗?不加的话应该也有同样的效果吧?
这不太可能产生任何影响。没有证据表明该问题是由拥堵引起的。有证据表明您的手机关闭不活动的 WiFi 以节省电量......
| 归档时间: |
|
| 查看次数: |
2097 次 |
| 最近记录: |