我正在尝试通过WiFi将我的Galaxy Ace连接到我的笔记本电脑。两台设备都通过WiFi连接到路由器,双方都使用Java。
在TCP连接不时给我很高的ping后,我决定将连接基于UDP,以便能够控制数据包的实际发送时间。
但是,似乎Android仍然会缓冲UDP数据包并且不会立即发送它们。如果在几分之一秒内没有传输传出数据,那么它会完全关闭WiFi。
首先,只要没有收到任何回复(覆盖UDP中的数据包丢失),我就会以不规则的间隔大约每秒钟一次拨打电话,重复发送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
我通过每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尽快响应,而不需要在网络上扔掉无用的数据。那么,有更优雅的解决方案吗?
顺便说一句,我假设问题是智能手机,而不是计算机,虽然它也可能是等待传入数据包然后发送数据包的计算机。根据我对网络的了解,这是不太可能的。
感谢您的帮助!
答案 0 :(得分:2)
就Java而言,一旦调用了DatagramSockect.send(...),数据报就会被“发送”。 Java应用程序空间中没有缓冲,也无法控制操作系统中的任何缓冲。
TCP或UDP不太可能“阻止”数据包。根本问题更有可能是WiFi级别的问题......或者可能是路由......并且操作系统正在推迟发送数据包直到问题自行解决。
谢谢,我现在只有在那段时间内没有其他数据包发送时才会发送保持活动数据包。
听起来你的保持活跃的ping具有预期的效果......从中我推断根本问题是由于不活动而导致WiFi“链接”被丢弃。 (这听起来像是“不要耗尽电池”功能......)这表明另一种解决方法是看看你是否可以调整WiFi超时。
除此之外,将数据包发送到另一个没有人监听的端口会更快吗?没有,它应该仍然具有相同的效果,对吧?
不太可能有任何区别。没有证据表明问题是由拥堵引起的。证据表明您的手机关闭了非活动WiFi以节省电量......