Java Android长轮询TCP连接

Java Android长轮询TCP连接,java,android,sockets,tcp,long-polling,Java,Android,Sockets,Tcp,Long Polling,从一个月以来,我一直试图在不使用外部图书馆或gcm的情况下进行适当的“推送” 首先,我用asmack尝试xmpp,然后用paho或ibmmqtt客户机尝试mosquito,用alarmtimer尝试http 最后,我以deacon和meteord结束,但由于它不是很好(在服务器端-高cpu和内存负载),我试图做一个长轮询连接 我知道这需要心跳,最后我在考虑延迟(300秒心跳应该足够了?)和正确的方法 从服务器向客户端发送心跳信号(使用1字节或其他字节)并在客户端设置套接字超时300(例如延迟30

从一个月以来,我一直试图在不使用外部图书馆或gcm的情况下进行适当的“推送”

首先,我用asmack尝试xmpp,然后用paho或ibmmqtt客户机尝试mosquito,用alarmtimer尝试http

最后,我以deacon和meteord结束,但由于它不是很好(在服务器端-高cpu和内存负载),我试图做一个长轮询连接

我知道这需要心跳,最后我在考虑延迟(300秒心跳应该足够了?)和正确的方法

从服务器向客户端发送心跳信号(使用1字节或其他字节)并在客户端设置套接字超时300(例如延迟300秒)更好(电池使用等),还是从客户端向服务器发送心跳信号更好

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

观察者正在观察一个对象,该对象确实在线程中建立了tcp套接字连接,并在断开连接(套接字超时)后重试

如果网络连接发生变化,我也会与广播接收器进行检查,并在需要时重新连接

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

当设备进入待机状态时,是否会断开连接

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

但至少看起来电池耗电是不“可接受的”

所以。。最好的方法是什么


到目前为止,非常感谢。

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

执行此操作的最佳解决方案是使用and或至少使用and。我还创建了一个返回sticky并在启动时创建线程的服务。螺纹连接。即使在待机和/或深度睡眠状态下,它仍然可以工作。

对于Java,有一个相当成熟的项目实现websocket和长轮询回退:。它也有相当宽松的许可条款(BSD/Apache风格)。

谢谢你,但它似乎仍然保持连接,因为deacon“几乎”是一样的,而且它还在工作。好吧,我无法识别在待机状态下Wifi中的任何断开连接,但我猜这可能会在一段时间后发生(如果GC需要的话)。但是由于这个原因,有一个带有return\u sticky的服务。迪肯没有任何电池问题(例如)。现在,由于服务器到客户端在2秒钟的延迟内发出ping,我无法识别任何电池耗尽。嗯,连接必须是永久性的。2秒可能有点快。高级wifi设置中有一个系统设置,可防止设备在待机状态下断开连接。谢谢您的提示。我不知道。在galaxy s3上,即使在待机状态下,它也能在wifi上成功工作。GC销毁了服务,但线程仍在运行。当线程被终止时(但它占用的内存不多,所以gc通常不会终止它),它将返回。“2秒”仅用于电池排放测试。我想300是一个“好”的间隔。但这仍然不是最好的解决方案。那么,有什么改进吗?