Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 仅在移动应用程序需要时使用WebSocket(通过socket.io)的模式_Node.js_Socket.io - Fatal编程技术网

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

Node.js 仅在移动应用程序需要时使用WebSocket(通过socket.io)的模式,node.js,socket.io,Node.js,Socket.io,我正在开发一个移动应用程序,有时需要近实时的更新,所以我希望在必要时使用WebSocket。一些早期的测试似乎表明,一直使用websocket来维护手机,可以使手机上的数据连接不断打开,从而加快电池消耗 因此,我认为在大多数情况下使用常规ajax风格的请求,并且仅在必要时使用WebSocket,会更节省电池电量 我不熟悉socket.io-它是否提供了手动“降级”连接的方法?如果没有,我希望在它上面有一个通信层-有人能建议在socket.io上面有一个层,允许我在websocket和常规ajax

我正在开发一个移动应用程序,有时需要近实时的更新,所以我希望在必要时使用WebSocket。一些早期的测试似乎表明,一直使用websocket来维护手机,可以使手机上的数据连接不断打开,从而加快电池消耗

因此,我认为在大多数情况下使用常规ajax风格的请求,并且仅在必要时使用WebSocket,会更节省电池电量

我不熟悉socket.io-它是否提供了手动“降级”连接的方法?如果没有,我希望在它上面有一个通信层-有人能建议在socket.io上面有一个层,允许我在websocket和常规ajax连接之间手动切换吗?

我不确定您想要什么类型的层,或者您认为这样一个层的要求是什么

对于webSocket,您可以在需要时从客户端打开它,然后在不再需要时从客户端关闭它。只要您保留一个打开/关闭标志或一个空/非空套接字变量,您就会知道是使用它,因为它已经打开了,还是在它未打开时发出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();
     }
 }

您是否也考虑过在需要时关闭并重新打开WebSocket?我非常确定这应该与使用XHR调用进行轮询一样节省电池(如果不是更多的话)。实际上……不,我没有想到。所以我的模式是在不需要“实时”时关闭套接字“联系。我必须尝试一下。添加了一个示例函数,该函数将通过所需和可用的传输发送数据。