安卓长轮询TCP连接

4

我已经尝试了几个方法,包括使用asmack的XMPP、paho或IBM MQTT客户端的Mosquitto以及alarmtimer的HTTP,但都没有使用外部库或GCM来实现“推送”。

最终,我使用了Deacon和Meteord,但由于服务器端存在很高的CPU和内存负载,因此我正在尝试建立一个长轮询连接。

我知道它需要一个心跳,并且最后我考虑了延迟(300秒的心跳是否足够?)和适当的方式。

从服务器到客户端发送一个字节大小的心跳(例如每300秒一次),并在客户端设置300秒的套接字超时时间,还是从客户端发送心跳更好(例如,客户端向服务器发送心跳)?哪种方式对电池使用等方面更好?

目前我正在使用一个服务,在onCreate中注册观察者,在onDestroy中注销观察者。 观察者观察一个对象,在一个线程中建立TCP套接字连接,并在断开连接(套接字超时)后重试。

我还用广播接收器检查网络连接是否更改,并在需要时重新连接。

当设备进入待机状态时会发生什么?我真的需要一个alarmmanager或timertask来接收或发送数据包吗? 设备进入待机模式后会断开连接吗?

目前,我尝试使用120秒的延迟从服务器到客户端发送心跳,即使设备的显示关闭了,仍然可以发送心跳。

但是,至少看起来电池耗电情况并不“可接受”。

那么,什么是最好的方法呢?

感谢您的帮助。

3个回答

1
最好的解决方案是使用RESTComet Server,或者至少使用NGinxPush Stream ModuleLong Polling。我还创建了一个服务,可以返回粘性连接并在启动时创建线程。该线程连接,即使处于待机和/或深度睡眠状态也仍然有效。

0

对于Java而言,有一个非常成熟的项目实现了WebSocket和长轮询回退:https://github.com/cometd/cometd。它还具有相当宽松的许可证条款(BSD / Apache风格)。


0

看一下socket.io,它有一个适用于Android的实现。我认为在屏幕关闭时保持连接活动不是一个好主意,因为这会消耗电池电量。我无法回答你所有的问题,但我知道默认情况下,在某些设备上当设备进入待机状态时Wi-Fi连接会被断开(也可能取决于用户配置的设置)。


谢谢,但似乎它仍然保持连接,因为Deacon做了“几乎”相同的事情,并且能够正常工作。https://github.com/davidrea/Deacon/blob/develop/src/org/deacon/MeteorPushReceiver.java嗯,我无法识别待机时Wifi的任何中断,但我猜这可能会在一段时间后发生(如果GC需要的话)。但出于这个原因,有带有return_sticky的服务。Deacon没有任何电池问题(例如)。现在,使用2秒延迟从服务器到客户端进行ping测试,我无法识别任何电池消耗。好吧,连接必须永久在线。 - Emanuel
2秒可能有点快。在高级WiFi设置中有一个系统设置,可以防止设备在待机时断开连接。 - MobileSam
谢谢你的提示。我不知道那个。在Galaxy S3上,即使处于待机状态,它也可以在WiFi上成功运行。GC销毁了服务,但线程仍在运行。当线程被杀死时(但它所占用的内存不多,所以通常GC不会将其杀死),它将重新启动。那个“2秒”只是为了测试电池耗电量。我猜300是一个“好”的间隔时间。但这仍然不是最好的解决方案。那么,有任何改进建议吗? - Emanuel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接