Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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
Javascript Cordova:套接字、推送通知还是重复轮询服务器?_Javascript_Node.js_Cordova - Fatal编程技术网

Javascript Cordova:套接字、推送通知还是重复轮询服务器?

Javascript Cordova:套接字、推送通知还是重复轮询服务器?,javascript,node.js,cordova,Javascript,Node.js,Cordova,我有一个Cordova/PhoneGap应用程序 当应用程序在前台时,我希望有一些实时更新的假象 实现这一目标的资源密集度最低的方法是什么?我应该使用socket.io、pushnotification插件,还是每隔几秒钟发出一个API请求?在设备和服务器上最省钱的是什么?对于移动设备,在电池使用、网络使用和更新的及时性之间有一个经典的权衡 内置于移动操作系统中的推送通知服务旨在为您提供所有这些折衷方案中的最佳方案,它在全球范围内运行,而不是在每个应用程序上运行(通常效率更高),尽管它让您对实现

我有一个Cordova/PhoneGap应用程序

当应用程序在前台时,我希望有一些实时更新的假象


实现这一目标的资源密集度最低的方法是什么?我应该使用socket.io、pushnotification插件,还是每隔几秒钟发出一个API请求?在设备和服务器上最省钱的是什么?

对于移动设备,在电池使用、网络使用和更新的及时性之间有一个经典的权衡

内置于移动操作系统中的推送通知服务旨在为您提供所有这些折衷方案中的最佳方案,它在全球范围内运行,而不是在每个应用程序上运行(通常效率更高),尽管它让您对实现细节的控制有所减少

在比较socket.io和轮询API时,socket.io(更具体地说是webSockets)被设计成从服务器获取异步通知的更有效的方式

在socket.io中,创建到服务器的套接字连接。该连接在应用程序运行期间(前台)保持打开状态,服务器可以随时向您发送数据,您将在发送数据时立即收到数据。由于连接可能会丢失,并且不一定会立即通知端点,
socket.io
使用在客户端和服务器之间定期发送的小心跳数据包。如果心跳数据包停止响应,则socket.io将假定连接已断开,并将关闭原始套接字并尝试创建新连接。这一切都是透明和自动为您完成的。然而,这种心跳对移动设备有一些不希望的影响。发送的数据很小,因此它实际上不是带宽使用的问题,但移动设备的每次传输都使用电池,如果让它长时间运行,这可能是相关的。socket.io中的心跳间隔是可配置的。可以将其关闭(不推荐),也可以将时间间隔设置为更长的时间

OS推送服务和socket.io在服务器端都非常有效,因为服务器只在有东西要发送到客户端时才工作,而不必在无事可做的情况下处理常规请求

这里轮询的唯一可能优势是,如果您希望的更新间隔很长(例如,每小时一次),或者它通常不打开,并且只是偶尔使用。然后,您可以每小时或根据需要发送一个Ajax调用,服务器无需做任何事情,只需回答偶尔的Ajax调用。如果所需的时间间隔较短,则可能需要使用一种真正的推送机制(OS push或socket.io)。

使用WebSocket

基于轮询的方法引入了最小的开销,即必须每X秒发出一次请求以检查任何新消息,这给了你一个糟糕的权衡:请求率越低,你的应用程序响应越差。xhr通过将http请求保持打开状态30-60秒左右,允许服务器尽快发送响应,从而在一定程度上降低了这一成本,但这仍然要求有一个固定的请求间隔

websocket是一个持久连接,这意味着每个客户端的连接都保持打开状态。这意味着内存的使用,但我不会太担心。在持久化连接之前,您将遇到实际消息流量的瓶颈

这是一本非常好的读物,让您了解node.js上的WebSocket可以实现何种规模:

有很多选择,我推荐的两个是socket.io和。它们都很容易启动和运行。它们还将为您处理诸如定义消息通道、连接/断开连接协议之类的事情,并且它们还具有选择客户端和服务器都支持的正确传输的额外优势。例如,Socket.io1.0+(使用engine.io)将从长轮询开始,如果两个端点都支持它,则升级到WebSocket,这可以加快速度。Faye是一个很好的轻量级发布/订阅系统,而socket.io则是更复杂的、基于会话的产品。根据您的需要,其中一个可能是一个不错的选择


如果最大限度地减少请求负载是您最关心的问题,那么直接使用npm
ws
(socket.io和faye都依赖于此)实现WebSocket也是一个选项,但这显然更复杂。

根据我的建议,使用socket.io是最好的选择,而每隔几秒钟提出一次请求是其中最糟糕的方法these@A.B:我并不反对,但你是如何得出套接字优于推送通知的结论的?我猜在用户拒绝使用推送通知的情况下,这是一种回退,在应用程序打开时仍允许实时更新?因为使用cordova中的JS和JS背景大多数人喜欢使用它,因为他们已经使用过它,@sanfor这是我的观点,所以我没有添加答案,因为我不确定其他观点:)太好了@jfriend00,socket.io是否会在phonegap(localhost file://issue)中正常工作,就像在web应用程序中一样(使用node.JS)?设置它时遇到了困难up@A.B-有关将socket.io与PhoneGap:and一起使用的一些信息。看起来你可能需要做一些适当的phonegap配置工作,这样才能工作。@A.B-你的问题得到回答了吗?谢谢分享链接和这个问题,我已经读过了,它似乎很有用,但我还没有实际尝试过。如果我们能在不学习pusher.com的很多文档的情况下实现实时移动应用,那就太好了,火基等