所以...我正在为Android应用程序。 该应用程序需要发送和接收实时聊天数据(需要一个插座),但它也需要发送命令(如客户知道当它发送一些东西,不要)。
我需要知道什么是节约用户的电池方面有更好的解决方案。
a)开幕,每一个命令发送时间关闭连接,如果聊天标签打开,然后保持连接不变。
B)保持不变连接所有的时间。
我已经采取了在互联网一起来看看,但已经得到了答案混合,有人说保持持久连接是不好的电池寿命和其他人说,这是不是(例如:“你是问,如果拿着一个TCP连接开放会消耗电池-生命?也许我的路要走,但在这里,拿着连接开放不应该浪费电池寿命......如果你认为它会我很想知道你在哪里得到这些信息。这听起来很奇怪,我。”)
或者,如果有另一种解决方案,效果会更好。 我不认为谷歌的C2DM将是非常有用的都在这种情况下,无论是。
基本上,消耗电池电量更多:具有持续的连接,或者打开和关闭连接,除非聊天选项卡打开?
谢谢!
保持空闲的TCP套接字连接打开(与正在发送或接收的任何数据)将不会(或者至少,不应该)消耗任何比具有它关闭更多的电池。 这是因为在空闲TCP连接不使用带宽或CPU周期(*)。
这就是说,保持TCP连接开放长时间可能不适合移动设备的最佳选择,因为TCP连接不与睡觉计算机进行交互良好。 这个问题的情况是这样的:你的Android用户将自己的Android设备上的应用程序运行时睡觉,然后远程用户的程序(或任何在TCP连接的另一端)在TCP流发送一些数据。 远程用户的计划从来没有得到任何的ACK回从Android设备,自然是因为Android设备是睡着了,所以远程设备的TCP协议栈假定它发送的TCP数据包必须已经丢失,并增加其超时时间响应,减少其TCP窗口大小(又名数的-TCP-数据包允许的,在飞行一次刻录),并重新发送TCP数据包。 但在Android设备仍处于休眠状态,因此,同样的事情再次发生。 其结果是,几分钟后,TCP连接的远端已经放缓的地步,即使在Android设备被唤醒,TCP连接将可能是可用太慢 - 此时你程序将需要关闭熄火了向下的TCP连接,反正启动一个新的一个,何必试图保持它打开?
所以我的建议是去与选项(A),与你关闭TCP连接,您的设备被持续至睡眠,现在程序的一部分规定。
一个可能的警告是,如果Android有一个功能,保持TCP连接开放使WiFi或蜂窝网络硬件在它本来可以进入睡眠状态的情况下仍然保持供电 - 如果是这样的话,那么在Android设备将付出电池的成本为天线,它不会否则必须支付供电。 我不知道任何Android的逻辑是一样的,但我只用Android的一点点,这样可能只是我的一部分无知。 这可能是值得测试的,至少。
(*)当然,从技术上TCP并每隔一段时间发送“保活”的分组,而TCP连接是开放的,而且确实使用了一些CPU周期和天线功率......但在Android上发送keepalive报文的默认间隔为2小时 ,所以我怀疑使用,这将是明显的权力。
为了真正保持连接打开,你很可能不得不心跳信号来回发送,由于Android设备和服务器之间的有状态的路由器会忘记一个相对较短的时间后进行连接。
哪个是更好的一切都取决于你多久你会去看,而不需要连接到服务器。 如果要连接大约每30秒左右大部分反正时间,绝对保持连接打开,但如果没有,你可能会更好关闭它。
电池有很大关系,从DCH / FACH / IDLE在3G无线状态转换。 如果你想有一个应用程序,它是能源效率,你应该尽可能多的数据的发送尽可能在有限的时间间隔不相关的持久连接或不...
文章来源: Socket connections and Polling. Which is a better solution in terms of battery life?