仅在需要移动应用程序时使用websockets(通过socket.io)的模式

时间:2015-05-05 18:17:26

标签: node.js socket.io

我正在处理移动应用程序,有时需要接近实时更新,因此我希望在必要时使用websockets。一些早期的测试似乎表明,一直使用websocket保持我的手机上的数据连接不断打开,导致更快的电池消耗。

所以我认为在大多数情况下使用常规的ajax样式请求会更节省电池效率,并且只在必要时才使用websockets。

我是socket.io的新手 - 它是否提供任何手动降级"降级"连接?如果不是,我会想要一个通信层 - 有人可以在socket.io上建议一个层,允许我在websocket和常规的ajax连接之间手动切换吗?

1 个答案:

答案 0 :(得分:0)

我不确定您想要什么样的图层或者您认为对这样的图层的要求是什么?

对于webSocket,您可以在需要时从客户端打开它,然后在不再需要时从客户端关闭它。只要你保持一个打开/关闭标志或只是一个null /非null套接字变量,你就会知道是否使用它,因为它已经打开,或者如果它没有打开就发出一个ajax调用。

由您的应用程序知道何时需要更多实时更新,它应该打开webSocket,当它不再需要实时更新时,它可以关闭套接字。这完全是应用程序逻辑,你还没有描述一个特定于应用程序的算法,所以如果没有一套详细的要求,我们就没有很多建议。

你是正确的,开放的webSocket将使用更多的电池而不是偶尔进行ajax调用。这是因为socket.io webSocket会每隔几分钟发送一次定期保持活动消息,因此客户端和服务器都可以知道连接何时死亡并且必须重新建立。这种常规传输确实需要电池。因此,如果您每隔15分钟将其与ajax呼叫进行比较,则ajax呼叫将消耗更少的电量。另一方面,如果您需要实时类型更新,那么您每15秒发出一次ajax调用以尝试轮询实时行为,那么webSocket将比这更有效,因为服务器可以只是在没有客户定期轮询的情况下在需要时发送数据。因此,它实际上取决于使用模式以及您需要更新的实时性。

我可以设想像这样的客户端函数:

 // variable that keeps track of when we have an open webSocket connection
 // null means no webSocket currently open, non-null means active webSocket

 var socket;

 // private helper function, don't call directly
 function _openSocket(msg, data) {
     if (!socket) {
         // establish webSocket
         socket = io();
         socket.on('connect', function() {
             if (msg) {
                  socket.emit(msg, data);
             }
         });
         socket.on('disconnect', function() {
             socket = null;
         });
     }
 }

 // send some data now
 function sendData(msg, data, openContinuous) {
     if (socket) {
         // webSocket already open
         socket.emit(msg, data);
     } else if (openContinuous) {
         _openSocket(msg, data);
     } else {
         // send data via ajax call
         $.ajax(...);
     }
 }

 // open a continuous connection (e.g. a socket.io connection) 
 // if not already open
 function openContinuous() {
     if (!socket) {
         _openSocket();
     }
 }