Android长轮询TCP连接

时间:2014-01-04 21:36:31

标签: java android sockets tcp long-polling

我试着在一个月内做一个正确的“推”而不使用外部图书馆或gcm。

首先我尝试使用asmack运行xmpp,然后使用paho或ibm mqtt客户端使用mosquitto,使用alarmtimer运行http。

最后我以deacon和meteord结束,但因为它不是很好(在服务器端 - 高CPU和内存负载)我试图做一个longpolling连接。

我知道它需要一个心跳,最后我在思考延迟(300秒心跳应该足够了吗?)和正确的方法。

从服务器到客户端发送Heartbeat(1字节或其他)(延迟例如300秒)并在客户端300设置套接字超时(或者更好)是否更好(电池使用等)要把它从客户端发送到服务器吗?

目前我正在使用一个服务,该服务在onCreate中注册一个观察者并在onDestroy中注销。

Observer正在观察一个在Thread中建立tcp套接字连接的对象,并在断开连接时重试它(套接字超时)。

如果网络连接发生变化,我还会检查广播密码,并在需要时重新连接。

设备进入待机状态会发生什么?我是否真的需要一个告警管理器或timertask来接收或发送数据包?

设备是否会丢弃它进入待机状态的连接?

目前我尝试从服务器发送到客户端,延迟时间为120秒,即使设备显示仍然可以发送心跳,也可以发送心跳。

但至少看起来电池耗尽并不“可接受”。

那么......最好的方法是什么?

到目前为止,谢谢你。

3 个答案:

答案 0 :(得分:1)

执行此操作的最佳解决方案是使用RESTComet Server或至少NGinx使用Push Stream ModuleLong Polling。我还创建了一个返回sticky的服务,并在启动时创建一个线程。线程连接。它甚至可以在待机和/或深度睡眠中工作。

答案 1 :(得分:0)

看看socket.io有Android的实现。我不认为在屏幕关闭时保持连接活着是一个好主意。我无法解答您的所有问题,但我知道默认情况下,当设备在某些设备上处于待机状态时,Wi-Fi连接会被终止(也可能取决于用户配置的设置)。

答案 2 :(得分:0)

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