使用centrifuge对接websocket

准备工作

  1. 了解 websocket 基本知识 https://www.runoob.com/html/html5-websocket.html
  2. 了解centrifuge的使用,阅读centrifuge客户端使用文档 https://fzambia.gitbooks.io/centrifugal/content/clients/javascript.html

前端引入centrifuge 插件 (npm、cdn两种方式择一)

  • npm方式:

    1. 安装centrifuge依赖:npm install --save centrifuge@1.5.0
    2. 引入centrifuge: import Centrifuge from 'centrifuge'
  • cdn方式

    1. 下载centrifuge.js 库,
    2. 并引入<script src='centrifuge.js'></script>

建立连接并授权

  1. 从后端获取ws-token: 该token用于websocket连接时授权自己(可参考 centrifuge客户端协议)
  2. 建立websocket连接并授权:传入websocket url、刚获取到的ws-token、当前登录用户id等参数, 建立websocket连接并授权自己
  3. 连接成功后, 在websocket 后台action 测试消息推送:以dev环境下 websocket url 为例, 如下图:
模拟消息推送.png

完整实现步骤(以npm方式为例)

从npm方式安装依赖 -> 引入插件 -> 获取签名ws-token -> 创建websocket连接并授权 -> 监听事件 -> 断开连接 等一系列步骤实现代码如下:

  1. 安装依赖 :npm install --save centrifuge@1.5.0

  2. 引入插件:import Centrifuge from 'centrifuge'

  3. 建立连接:

     /**
       * demo以dev环境下 登录用户id=1, 监听消息通知事件msg为例
       */ 
    const params = {
       user_id: 1 // 当前登录用户id
     } 
     // 从后端获取签名用于连接授权(签名根据secret、user、timestamp等,通过hashmap、二进制流、sha256换算得到)
     apiWebsocketSign(params).then(res => {
         const sign = res.access_token // 签名
         const timestamp = res.timestamp // 时间戳
         const user = res.user // 当前登录用户id:1
​
         // 与Websocket端点建立连接,并通过签名授权
         const url = 'wss://××××.com:9112/connection/websocket', 
         let centrifuge = new Centrifuge({
               url: url, // websocket url,不同环境不同, demo以dev环境为例
               user: user,
               timestamp: timestamp,
               token: sign
         })
         centrifuge.connect()
​
         // 监听msg:1 是否有未读新消息
         centrifuge.subscribe('msg:1', (message) => {
             /**
               * user_id=1 用户 的实时系统消息
               * @message {object}: 推送消息内容
               */
                 console.log(message)
           })

           // 连接成功回调
           centrifuge.on('connect', (context) => {
                 console.log('连接成功', context)
           })

           // 断开连接回调
           centrifuge.on('disconnect', (context) => {
                 console.log('断开连接', context)
            })

           // 错误连接回调
           centrifuge.on('error', (error) => {
               console.log('错误连接', error)
           })
​
           // 监听窗口关闭事件,主动关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
           window.onbeforeunload = () => {
                 centrifuge.disconnect()
           }
     })
}

注意点

  1. centrifuge不能用最新版本,新版不兼容,直接选择1.5.0版本
  2. url注意前缀替换: http -> ws, https -> wss, 且url后面追加路径 /connection/websocket

后端注意点

  • 提供前端不同环境(dev/test/pre/info)下的websocket url

  • SSL证书有效(不能过期)

  • 返回有效签名ws-token 给前端(用于连接时授权)

  • 提供前端需要监听的事件方法,如监听userid = 1用户的 消息推送: 此时告知前端要监听 msg:1即可

(备注:如有讲错请在评论区指出,我可不能误人子弟啊哈~~~ 原创文章,欢迎转载,转载请注明出处,多谢支持~~~)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,294评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,780评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,001评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,593评论 1 289
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,687评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,679评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,667评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,426评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,872评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,180评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,346评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,019评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,658评论 3 323
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,268评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,495评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,275评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,207评论 2 352

推荐阅读更多精彩内容