当前位置: 首页 > 面试题库 >

Cordova:套接字,PushNotifications还是反复轮询服务器?

乜心思
2023-03-14
问题内容

我有一个Cordova / PhoneGap应用程序。

html" target="_blank">应用程序在前台时,我想进行一些实时更新。

什么是最不消耗资源的方式来完成此任务?我应该使用socket.io,pushnotification插件还是仅每隔几秒钟发出一次API请求?设备和服务器上最少的负担是什么?


问题答案:

对于移动设备,您需要在电池使用量,网络使用量和更新及时性之间进行权衡。

内置在移动操作系统中的推送通知服务旨在尽力为您提供所有这些权衡,并且它在全球范围内运行,而不是每个应用程序运行(通常效率更高),尽管它使您对实现细节的控制较少。

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

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

从服务器端的角度来看,操作系统推送服务和socket.io都是非常高效的,因为服务器仅在有实际要发送给客户端的东西时才起作用,而不必在无事可做的情况下发出常规请求。

此处进行轮询的唯一可能优势是,如果所需的更新间隔较长(例如,每小时一次),或者通常不启用且仅偶尔使用。然后,您可以每小时或在需要时发送Ajax呼叫,而服务器除了应答偶尔的Ajax呼叫外,无需执行任何其他操作。如果所需的时间间隔较短,则可能要使用一种真正的推送机制(操作系统推送或socket.io)。



 类似资料:
  • 线程“main”java.net.ConnectException:连接超时:在java.net.dualStackplainsockeTimpl.Connect0(本机方法)在java.net.dualStackplainsockeTimpl.socketConnect(DualStackplainsockeTimpl.java:69)在java.net.abstractplainsockeTi

  • 我正在开发web套接字应用程序。从前端来看,每个应用程序都有一个插座。但我不确定后端。我们将Python和nginx与Flask socketIO和socket io客户端库一起使用。此体系结构将用于通知前端发生了更改,并应更新数据。 以下是我的疑问-服务器上将创建多少套接字和线程?不同连接之间是否可以共享套接字?是否有任何工具可以分析插座是否打开?

  • 我目前正在探索SignalR,该技术支持传输(Web wockets、长轮询、服务器发送的事件和永久帧)。 我已经理解了术语web套接字和长轮询。但什么是服务器发送事件和永久帧? 这四个人有什么不同?

  • 我想找个人来澄清一个我相信我有的误解。我在读Java上的套接字编程,并不真正理解事情的实际流程是什么。以下是我对以下场景的两种可能的解释。 创建套接字实例 null 服务器接受客户端之后的连接会是这样的吗?(客户端与服务器创建的套接字通信,而不是与服务器套接字通信) 或者图表会像这样吗?(客户端通过ServerSocket与服务器保持通信。服务器通过接受连接时创建的套接字进行通信。)

  • 我试图用java实现一个客户端服务器,在这里我读取客户端中的输入并在服务器中执行UperCase,然后返回客户端并打印UperCase。我使用ObjectOutputStream和ObjectInputStream进行读写,但是当我在客户机中键入一个msg时,程序会显示以下错误: Digite uma msg casa java.io.eofexception位于java.io.datainput

  • 问题内容: 我有一个客户端服务器程序在服务器端使用套接字,并且读写发生在这种方式 同样在cilent(android)方面… 问题是,建立连接后,程序会卡住它们,没有错误,也没有异常。停下来 问题答案: 这是一个死锁,您必须首先创建并刷新ObjectOutputStream。这是因为ObjectInputStream在继续操作之前先读取OOS发送的标头。