我正在尝试通过WiFi连接我的银河王牌和我的笔记本电脑。两台设备都通过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我解决了这个问题,在手机和电脑之间每隔100ms只发送一个字节的数据包,程序中除了这个以外什么都不改变:
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尽可能快地做出响应,而不需要在网络上到处扔无用的数据。那么,有没有更优雅的解决方案呢?
顺便说一句,我认为问题出在智能手机上,而不是电脑上,尽管它也可能是电脑在等待传入的数据包,然后发送它的数据包。根据我对网络的了解,这是不太可能的。
谢谢你的帮忙!
发布于 2012-11-26 12:50:52
就Java而言,一旦DatagramSockect.send(...)已调用,则数据报被“发送”。Java应用程序空间中没有缓冲,也没有办法控制操作系统中的任何缓冲。
TCP或UDP不太可能“阻止”数据包。更有可能的是,问题的根源在于WiFi级别的某些东西……或者可能是通过路由...而操作系统会延迟发送数据包,直到问题自行解决。
谢谢,我现在实现了只有在这段时间内没有发送其他数据包的情况下才发送那些保持连接的数据包。
听起来你的保活ping产生了想要的效果...由此我推断,问题的根源在于WiFi“链接”由于不活动而被丢弃。(听起来像是“不要耗尽电池”功能……)这表明,另一种解决方法是查看是否可以调整WiFi超时。
除此之外,将数据包发送到没有人监听的其他端口是否会更快?它应该仍然有相同的效果,没有,对吗?
这不太可能有什么不同。没有证据显示这个问题是由交通挤塞引起的。证据表明你的手机为了省电关闭了不活动的WiFi。
https://stackoverflow.com/questions/13558283
复制相似问题