Pusher 协议概述

Pusher 协议 是一种用于实时 Web 通信的协议,它基于 WebSocket 技术,并提供了一套 发布-订阅(Pub/Sub)模式,用于让客户端(如浏览器、移动端、后端服务)可以实时接收服务器端推送的消息。Pusher 还支持 HTTP 轮询和 Fallback 方案,以保证兼容性。


Pusher 协议的核心概念

1. 连接 (Connections)

  • 客户端(通常是 Web 浏览器或移动设备)通过 WebSocket 连接到 Pusher 服务器。
  • 连接后,客户端会发送 连接请求,服务器会在成功连接后返回确认信息。

2. 频道 (Channels)

  • 频道 是 Pusher 协议的核心概念,类似于 Pub/Sub 机制中的主题(Topic)。
  • 客户端可以 订阅 (subscribe) 频道,并接收服务器端在该频道上广播的事件。

频道的类型

频道类型 说明
Public 公开频道,所有连接的客户端都可以订阅,无需身份验证。
Private 私有频道,需要身份验证才能订阅,通常用于保护敏感数据。
Presence 带用户状态的私有频道,可以查看在线用户列表,适用于聊天应用或在线状态管理。

3. 事件 (Events)

  • 事件 是 Pusher 协议中最重要的概念,表示服务器或客户端触发的特定消息。
  • 事件通过 WebSocket 进行广播,客户端监听并处理它们。

常见事件

事件名称 说明
pusher:connection_established 连接成功事件,服务器发送给客户端,包含 socket_id。
pusher:subscribe 客户端发送的订阅频道请求。
pusher:unsubscribe 客户端请求取消订阅频道。
pusher:member_added Presence 频道中新成员加入事件。
pusher:member_removed Presence 频道中成员离开事件。
自定义事件 例如 chat:new_message,用于在应用程序中传递业务数据。

4. 认证 (Authentication)

  • 私有频道 (Private Channels) 和 Presence 频道 需要 身份认证。
  • 认证方式:
    1. 客户端尝试订阅 Private 或 Presence 频道。
    2. 服务器会检查用户身份,并返回 签名 (HMAC),客户端需要带上这个签名才能订阅成功。

Pusher 协议的数据格式

Pusher 使用 JSON 格式传输数据,每个 WebSocket 消息通常包含以下字段:

{
"event": "event-name",
"channel": "channel-name",
"data": { "message": "hello world" }
}

示例:

{
"event": "chat:new_message",
"channel": "chat-room-1",
"data": { "user": "Alice", "message": "Hello, Bob!" }
}

Pusher 协议的 WebSocket 交互流程

1. 连接阶段

  1. 客户端 通过 WebSocket 连接到 Pusher 服务器:
    ws://pusher.example.com/app/{appKey}?protocol=7&client=js&version=7.0
  2. 服务器返回 pusher:connection_established 事件:
    {
    "event": "pusher:connection_established",
    "data": {
    "socket_id": "1234.5678",
    "activity_timeout": 30
    }
    }
    • socket_id:唯一标识这个连接的 ID
    • activity_timeout:如果客户端超过这个时间未发送数据,服务器可能会断开连接。

2. 订阅频道

  • 客户端发送订阅请求:
    {
    "event": "pusher:subscribe",
    "data": {
    "channel": "chat-room-1"
    }
    }
  • 服务器返回成功订阅的响应:
    {
    "event": "pusher_internal:subscription_succeeded",
    "channel": "chat-room-1",
    "data": {}
    }

3. 事件广播

  • 客户端或服务器向频道广播事件:
    {
    "event": "chat:new_message",
    "channel": "chat-room-1",
    "data": {
    "user": "Alice",
    "message": "Hello, Bob!"
    }
    }
  • 所有订阅了 chat-room-1 的客户端都能收到这个消息。

4. 取消订阅

  • 客户端发送取消订阅请求:
    {
    "event": "pusher:unsubscribe",
    "data": {
    "channel": "chat-room-1"
    }
    }

5. 关闭连接

  • 客户端主动关闭连接
    pusher.disconnect();
  • 服务器可能会因超时或异常关闭连接
    {
    "event": "pusher:disconnect",
    "data": {
    "reason": "ping timeout"
    }
    }

Pusher 协议流程图

sequenceDiagram
participant Client
participant Pusher Server
participant Application Server

Client->>Pusher Server: 1️⃣ 连接 WebSocket (ws://pusher.example.com/app/{appKey})
Pusher Server->>Client: 2️⃣ pusher:connection_established (返回 socket_id)

Client->>Pusher Server: 3️⃣ pusher:subscribe (订阅 chat-room-1)
Pusher Server->>Client: 4️⃣ pusher_internal:subscription_succeeded

Application Server->>Pusher Server: 5️⃣ 通过 API 触发事件 (chat:new_message)
Pusher Server->>Client: 6️⃣ chat:new_message (广播消息)

Client->>Pusher Server: 7️⃣ pusher:unsubscribe (取消订阅 chat-room-1)
Pusher Server->>Client: 8️⃣ pusher:disconnect (超时或主动断开)


Pusher 协议的应用场景

Pusher 协议广泛用于 实时 Web 应用,常见应用包括:

  1. 即时聊天 (Chat Applications)

    • 用户可以订阅聊天频道并接收新消息。
  2. 通知系统 (Real-time Notifications)
    • 服务器推送重要的系统通知,如订单状态更新。

总结

  • Pusher 协议是基于 WebSocket 的实时通信协议,支持 Pub/Sub 模式。
  • 使用 Channels(Public、Private、Presence) 来管理订阅关系。
  • 事件驱动机制:服务器或客户端可以触发事件,Pusher 负责分发。
  • 支持身份认证,确保 Private 和 Presence 频道的安全性。
  • JSON 格式传输数据,易于解析和处理。

Laravel11 从0开发 Swoole-Reverb 扩展包(二) - Pusher 协议介绍的更多相关文章

  1. Cloudera5.8.3 HBase1.2.0开发必须的jar包

    Cloudera的HBase开发环境下载依赖包特别麻烦,通常是直接在CDH服务器上拷.

  2. 从0开发3D引擎(十二):使用领域驱动设计,从最小3D程序中提炼引擎(第三部分)

    目录 上一篇博文 继续实现 实现"DirectorJsAPI.init" 实现"保存WebGL上下文"限界上下文 实现"初始化所有Shader&quo ...

  3. PHP、thinkPHP5.0开发网站文件管理功能(二)删除文件

    1.is_dir():检查指定的文件是否是目录 2.scandir():返回指定目录中的文件和目录数组 3.unlink():删除文件,如果删除的文件不存在会报错,加@抑制报错 public func ...

  4. 让TP5.0在SWOOLE上飞起来

    TP-SWOOLE 目前,TP5.1官方已经提供了think-swoole2.0,集成程度以前优雅很多,不过5.0的集成方式确实有些鸡肋.所以看了下2.0,为5.0开发了一个扩展包,可以采用compo ...

  5. 如何开发、本地测试、发布 Laravel 扩展包?

    如何开发.本地测试.发布 Laravel 扩展包?  Laravel/ 1年前/  4022 /  11   现在已经有了很多,关于如何开发 Laravel 扩展包的文章.但是大多文章写的太过片面,不 ...

  6. laravel框架应用和composer扩展包开发

    laravel5.5+ laravel官方地址 laravel是目前最流行的php框架,发展势头迅猛,应用非常广泛,有丰富的扩展包可以应付你能想到的各种应用场景,laravel框架思想前卫,跟随时代潮 ...

  7. EJB3.0开发环境的搭建

    EJB Container的介绍SUN公司正式推出了EJB的规范之后,在众多的公司和开发者中引起了非常大的反响.标志着用Java开发企业级应用系统将变的非常easy.很多公司都已经推出了或正打算EJB ...

  8. HslCommunication库的二次协议扩展,适配第三方通讯协议开发,基础框架支持长短连接模式

    本文将使用一个gitHub开源的项目来扩展实现二次协议的开发,该项目已经搭建好了基础层架构,并实现了三菱,西门子,欧姆龙,MODBUS-TCP的通讯示例,也可以参照这些示例开发其他的通讯协议,并Pul ...

  9. Laravel 调试利器 —— Laravel Debugbar 扩展包安装及使用教程

    1.简介 Laravel Debugbar 在 Laravel 5 中集成了 PHP Debug Bar ,用于显示调试及错误信息以方便开发.该扩展包包含了一个 ServiceProvider 用于注 ...

  10. 从零实现Lumen-JWT扩展包(序):前因

    转自:https://zhuanlan.zhihu.com/p/22531819?refer=lsxiao 最近这段时间我寻思着把几个月前爬下来的6万多首诗词曲文做成一个API,免费开放给大家用. 这 ...

随机推荐

  1. https://gitlab.com/volian/nala/-/wikis/Installation

    Installation   Debian Testing/Sid Nala is officially in the testing and sid repos. sudo apt install ...

  2. [转]点云库PCL从入门到精通 随书源码(百度网盘下载)

    分享给需要的人. 这里有你想要的东西-暗号-pdx6 相关链接: PCL点云数据处理基础️️️目录

  3. [转]axios 的理解和使用

    有废话少说,直接附上原文链接: axios 的理解和使用 axios.create(对axios请求进行二次封装) 拦截器 取消请求(axios.CancelToken) 其它链接: 1.axios中 ...

  4. SpringBoot集成MinIO8.3.x 依赖冲突解决,至简之招覆盖spring-boot-dependencies的依赖版本声明

    版本声明 SpringBoot 2.6.5 MinIO 8.3.7 报错信息 An attempt was made to call a method that does not exist. The ...

  5. Solution -「CF 1366E2」Chiori and Doll Picking (hard version)

    \(\mathscr{Description}\)   Link.   给定 \(\{a_n\}\), 值域 \([0,2^m)\). 对于每个 \(i\in[0,m]\), 求有多少个 \(\{a_ ...

  6. 网站架构核心技disruptor

    一 序:本章业务场景:队列在数据结构中是一种线性表,从一端插入数据,然后从另一端删除数据.作者举例的场景有:进行异步处理.系统解耦.数据同步.流量削峰.缓冲.限流等. 前面的比较浅,总结起来,核心知识 ...

  7. 头文件中 ifndef/define/endif 有什么用?

    1. 相同的声明可以多次出现,重复声明不是错误! 定义不可以,无论是单个文件还是多个文件,某个特定作用域(比如全局变量),不可以重复定义变量. 2. 类/结构体的定义可以在多个文件中多次出现,但是不可 ...

  8. pytest基础

    pytest断言 1. == 直接对两端的值进行判断是否一致 1==1 2.assert in 判断值是否在正确范围   def test_jia(self): a='hello' b='a' ass ...

  9. oracle和sqlserver对于事务数据库死锁处理的区别

    create table aa_test ( id int constraint TEST_PK primary key, name varchar2(50) ) / insert into aa_t ...

  10. uni-app中使用uView组件库

    01通过npm的方式安装uView组件库 uView依赖SCSS,您必须要安装此插件,否则无法正常运行. 如果您的项目是由HBuilder X创建的, 相信已经安装scss插件, 如果没有,请在HX菜 ...