套接字连接和轮询。 在电池寿命方面哪个更好?

所以…我正在为Android做一个应用程序。 应用程序需要发送和接收实时的聊天数据(需要是一个套接字),但它也需要发送命令(这不是客户端知道什么时候发送的)。

我需要知道什么是挽救用户电池的更好的解决scheme。

a)每次发送命令时打开和closures连接,如果打开聊天标签,则保持连接不变。

b)始终保持连接不变。

我已经看了一下互联网,但得到了混合的答案,有人说,保持一个连续的连接是不利于电池寿命,别人说这不是(例如: “你问是否打开TCP连接将消耗电池生活?也许我会在这里,但是,打开连接不应该浪费电池寿命…如果你认为我会喜欢知道你的信息,这听起来很奇怪。

或者如果有另一种解决scheme会更好。 我不认为Google的C2DM在这种情况下也是非常有用的。

基本上,更多的是耗尽电池:持续连接,或打开和closures连接,除非聊天标签打开?

谢谢!

保持一个空闲的TCP套接字连接打开(没有数据发送或接收)不会消耗更多的电池,而不是closures它。 这是因为空闲的TCP连接不使用带宽或CPU周期(*)。

也就是说,保持TCP连接长时间打开可能对移动设备来说不是一个好的select,因为TCP连接与进入hibernate状态的计算机没有很好的交互。 这个问题的情况是这样的:你的Android用户在你的应用程序正在运行的时候让他的Android设备进入hibernate状态,然后远程用户的程序(或者TCP连接的另一端)通过TCPstream发送一些数据。 远程用户的程序永远不会从Android设备获取任何ACK,因为当然Android设备是睡着的,所以远程设备的TCP堆栈认为它发送的TCP数据包必须丢失,并且通过增加超时时间来响应,降低其TCP窗口大小(又名TCP-packet-allowed-in-flight-at-once),并重新发送TCP数据包。 但Android设备仍在睡觉,因此同样的事情再次发生。 结果是,几分钟后,TCP连接的远端已经放慢了,即使Android设备被唤醒,TCP连接也可能会太慢而无法使用。程序将需要closures陷入困境的TCP连接,并启动一个新的无论如何,为什么要打扰试图保持开放?

因此,我的build议是select(a),并规定您closuresTCP连接作为设备即将进入睡眠的一部分。

一个可能的警告是如果Android有一个function,保持TCP连接打开导致WiFi或蜂窝networking硬件保持通电的情况下,否则可能会进入睡眠 – 如果是这样的话,那么Android设备将为天线供电而支付电池成本,否则将不必付费。 我不知道这样的Android逻辑,但我只使用Android一点,所以可能只是无知我的一部分。 至less可以testing一下。

(*)从技术上讲,TCP在TCP连接打开的时候每隔一段时间就发送一个“keepalive”包,而且确实使用了一些CPU周期和天线功率,但是在Android上发送keepalive包的默认时间间隔是两个小时 ,所以我怀疑用于此的力量是显而易见的。

为了实际上保持连接打开,您可能必须来回发送心跳信号,因为android设备和您的服务器之间的任何状态路由器会在相对较短的时间后忘记连接。

哪一个更好取决于你认为你将会走多久,而不需要连接到服务器。 如果大多数情况下你每隔30秒连接一次,肯定要保持连接状态,否则,closures它可能会更好。

电池与DCH / FACH / IDLE 3G无线电状态转换非常相关。 如果你想有一个能源效率的应用程序,你应该发送尽可能多的数据在有限的时间间隔无关的持续连接或不…