对于推送通知,是否必须使用 websocket?

IT技术 javascript php html websocket push-notification
2021-03-10 17:22:34

我在服务器端有 PHP,在客户端有 HTML 和 javascript。

我正在制作一个应用程序,其中利益相关者键入一条消息,该消息实时广播给一个组的多个接收者。

我对谷歌做了一些研究,我知道我需要使用 WebSockets 或 Comet 来进行实时推送通知。WebSocket 或 Comet 是否必须向用户发送大量通知?

我的理解正确吗?任何参考开始?

3个回答

如果客户端是浏览器,那么标准浏览器连接到服务器的唯一两种方式是通过 Ajax(例如 http)请求或 webSocket 连接。因此,如果您希望客户端收到来自外部世界的通知,则必须使用这两种机制之一。

HTTP 请求是暂时的。 客户端向服务器发出请求,服务器响应。HTTP 请求非常适合客户端从服务器请求信息。他们不太擅长服务器向客户端发送信息,因为通常客户端没有连接。有一些黑客和变通方法,其中客户端在某个时间间隔“轮询”服务器,甚至服务器可能使用更长的运行请求来尝试模拟“推送”类型系统,但它们充其量只是次优黑客。

webSockets 是连续连接。 客户端连接,并且只要双方需要,连接就会保持原状。这允许任何一方随时向另一方发送消息。这意味着服务器可以随时将数据“推送”到客户端。webSockets 对于推送连接很有效,推荐使用(这是它们设计的主要目的之一)。

Comet 是一个库,最初是为了使用 HTTP 来尝试“破解”或“模拟”推送,在 webSockets 被发明之前,然后在它们被广泛支持之前。我想不出为什么要使用 Comet 而不是 webSocket ,除非你有一个不支持 webSocket 的旧浏览器。

因此,如果您尝试对浏览器进行“实时服务器推送”,那么您必须有一个来自客户端的持续连接的套接字,这意味着 webSocket(或构建在 webSocket 之上的东西,如 socket.io)。

对于可以访问手机 SDK 的手机应用,您可以使用操作系统内置的“推送”系统将一些消息从服务器推送到客户端。这与双向 webSocket 通道不太相同,但是由于您询问了“推送通知”,因此 Android 和 IOS 中可用的操作系统推送服务也可以作为将通知从服务器推送到客户端的选项。以下是有关iOS 通知Google Cloud Messaging 的信息

截至 2016 年,除了 Microsoft 浏览器(Edge 或 IE 尚不支持)之外,还可以在所有现代浏览器中使用服务器发送的事件将数据从服务器推送到客户端。这是浏览器兼容性表服务器发送的事件使用持久的 HTTP 连接、特殊的 MIME 类型和支持的客户端,以便能够随时从服务器向客户端发送事件。与 webSockets 不同,服务器发送的事件只是一种方式(从服务器到客户端)。然后客户端将使用传统的 Ajax 调用,以便能够将数据发送到服务器(而使用 webSocket 数据可以通过相同的 webSocket 连接以任何方式发送)。

这里很好地描述了服务器发送的事件是如何工作的:服务器发送的事件实际上是如何工作的?

是的,我知道这是相当澄清的,因为它似乎被建议用于 websockets。
2021-05-09 17:22:34
@Ixx - Android 和 iOS 都有一个内置于操作系统的推送服务。以下是有关iOS 通知Google Cloud Messaging 的信息这些显然与 webSockets 不同(它们也不打算如此),但是如果您只想偶尔从服务器向手机发送更新,这可能是最有效的方法。
2021-05-12 17:22:34
它是你在最后一段的过渡,你从 websockets 跳到“手机”,它读起来好像这相当于手机,它完全不同于你自己所说的。并且 websockets 也可用于手机。
2021-05-13 17:22:34
@Ixx - OP 正在询问“推送通知”选项。我的回答是,如果您的目标是带有自定义应用程序的移动设备,则操作系统推送服务是推送通知的一个选项。
2021-05-14 17:22:34
手机应用程序中的推送系统是什么意思?推送通知?这与 websockets 的行为不同......
2021-05-15 17:22:34

您的客户端应用程序是 SPA 吗?(单页应用程序)?这很重要,因为如果没有,您必须考虑每次客户端更改页面时,与 websocket 服务器的连接都会丢失。在这种情况下,您必须管理队列,因为如果利益相关者在一个客户端断开连接时发送多播请求,客户端将不会收到任何消息。轮询也不能解决这种情况,这是一个糟糕的解决方案,因为具有典型互联网计划的移动客户端(例如)将消耗兆字节用于无用的“ping”流量。投票的一个真实例子是一个孩子在车里每分钟都问他的父亲他们是否到达目的地!那么,有没有不使用spa的解决方案呢?是的,在利益相关者和客户之间使用“共享存储”,并且仅将 websocket 用于“唤醒”

每次客户端打开一个页面时,它都会从后端收到来自存储的未读通知。当利益相关者想要通知某事时,它只会将通知消息存储在共享存储中并向通知服务器发送“脉冲”。通知服务器会将“脉冲”转发给在线客户端(以防万一有人在阅读页面时卡住)。如果由于客户端正在更改页面而丢失“脉冲”,则没有问题,因为客户端将从存储中带来通知。每个页面都将包含此逻辑: 检索编号或未读通知(服务器端) 5 秒后连接到通知服务器(javascript 端)。希望能帮助到你。

我建议与其他选项相比,使用 webSockets 是一种更有效的方法,为什么会这样?那么当客户端收到服务器发生更改的通知时,无需创建对服务器的 AJAX 调用来获取该更改,它可以比 AJAX 更容易地通过相同的 webSocket 连接发送到客户端。这意味着高效的代码和运行速度更快的应用程序!