我在服务器端有PHP,在客户端有HTML和javascript。
我正在创建一个应用程序,其中一个利益相关者键入一个实时广播给一个组的多个接收者的消息。
我在google做了一些研究,我知道我需要使用WebSockets或Comet进行实时推送通知。是否强制要求WebSocket或Comet向用户发送群发通知?
我的理解是否正确?任何引用都以?开头?
答案 0 :(得分:41)
如果客户端是浏览器,那么标准浏览器连接到服务器的唯一两种方式是通过Ajax(例如http)请求或webSocket连接。因此,如果您希望客户端收到来自外部世界的通知,则必须使用这两种机制中的一种。
HTTP请求是暂时的。客户端发出服务器请求,服务器响应。 HTTP请求非常适合客户端请求来自服务器的信息。他们不太擅长服务器向客户端发送信息,因为通常客户端没有连接。客户"民意调查"有黑客和工作场所。服务器在某个时间间隔甚至服务器使用更长的运行请求来尝试模拟"推送"类型系统,但它们最好是次优的黑客。
webSockets是连续的连接。只要双方都想要,客户端就会连接并保持连接。这允许任何一方能够随时向另一方发送消息。这意味着服务器可以推送"数据随时发送给客户端。 webSockets对于推送连接是有效的,建议使用(这是他们设计的主要内容之一)。
Comet是一个最初构建用于使用HTTP来尝试" hack"或"模拟"在发布webSockets之前推送,然后在广泛支持之前推送。我想没有理由为什么人们想要使用Comet而不是webSocket,除非你有一个不支持webSocket的旧浏览器。
所以,如果你正在尝试做实时服务器推送"到浏览器,然后你必须有一个连续的连接套接字来自客户端,这意味着webSocket(或建立在webSocket之上的东西,如socket.io)。
对于可以访问手机SDK的手机应用,您可以使用" push"内置于操作系统中的系统将一些消息从服务器推送到客户端。这与双向webSocket频道完全相同,但由于您询问了推送通知",Android和IOS中可用的操作系统推送服务也可以作为推送通知的选项。服务器到客户端。以下是iOS notifications和Google Cloud Messaging
的信息截至2016年,除了Microsoft浏览器(Edge或IE中尚不支持)之外,所有现代浏览器中都可以使用Server-sent events将数据从服务器推送到客户端。这是browser compatibility table。服务器发送的事件使用持久的HTTP连接,特殊的MIME类型和支持客户端,以便能够随时从服务器向客户端发送事件。与webSockets不同,服务器发送的事件只是一种方式(从服务器到客户端)。然后,客户端将使用传统的Ajax调用,以便能够将数据发送到服务器(而webSocket数据可以通过相同的webSocket连接以任一方式发送)。
以下是对服务器发送事件如何工作的详细说明:How do server-sent events actually work?
答案 1 :(得分:0)
我建议与其他选项相比,使用webSockets是一种更有效的方法,为什么?好吧,当客户端收到服务器发生更改的通知时,无需创建对服务器的AJAX调用即可获取更改,与AJAX相比,可以使用相同的webSocket连接将其发送到客户端。这意味着高效的代码和运行速度更快的App!
答案 2 :(得分:0)
您的客户端应用程序是SPA吗? (单页应用程序)? 这非常重要,因为如果没有,则必须考虑到每次客户端更改页面时,与websocket服务器的连接都会丢失。 在这种情况下,您必须管理一个队列,因为如果利益相关者在一个客户端断开连接时发送多播请求,则客户端将什么也不会收到。 轮询也无法解决这种情况,这是一个糟糕的解决方案,因为具有典型Internet计划的移动客户端(例如)将为无用的“ ping”流量消耗数兆字节。 一个真正的民意测验例子是,一个孩子坐在车里,每分钟询问父亲是否到达目的地! 那么,有没有使用spa的解决方案吗? 是的,在利益相关者和客户之间使用“共享存储”,并且仅将websocket用于“唤醒”在线客户,说:嘿,有新东西,请检查!
每次客户端打开一个页面时,它都会从后端接收来自存储的未读通知。 当涉众想要通知某事时,它将只将通知消息存储在共享存储中,并向通知服务器发送“脉冲”。 通知服务器会将“脉冲”转发给在线客户端(以防万一有人停留在阅读页面上)。 如果由于客户端更改页面而丢失了“脉冲”,则没有问题,因为客户端将从存储中发出通知。 每个页面将包含以下逻辑: 检索号码或未读的通知(服务器端) 5秒钟后(javascript端)连接到通知服务器。 希望对您有所帮助。