Websocket 向指定用户发消息的方法


Posted in Javascript onJanuary 09, 2020

场景

用户正常发送一个http请求,需要处理一个耗时很长的任务,有可能这个任务要处理好几分钟,在任务处理期间 后台要不断的发送当前处理的进度日志等信息,打印在前端。也就是说 用户先发出一个正常的http请求,后面的就由Websocket来完成

技术点

当后端收到http请求后 如何确认是哪一个socket发出的?

实现思路

  • 为每一个socket设置唯一socketId并存入cookie
  • 后端接收到http取出其中的cookie信息拿到socketId,循环找到此id的socket发送消息

代码实现

前端代码

if (!Cookies.get('socketId')) {
  // 这里为模拟生成唯一id 建议 require('uuid')
  var uuid = Math.random() * 1000;
  Cookies.set('socketId', uuid)
}

function connectWebsocket() {
  let url = `ws://${document.location.host}`;

  var ws = new WebSocket(url);

  ws.onopen = function () {
    console.log("连接成功!");
    ws.send(
      JSON.stringify({
        type: "setSocketId",
        data: Cookies.get('socketId')
      })
    );
  };
  ws.onclose = function () {
    // 关闭 websocket
    console.log("连接已关闭...正在重连...");
    connectWebsocket()
  };
  ws.onmessage = res => {
    console.log("收到socket消息:", res.data)
    var data = JSON.parse(res.data)
    document.querySelector('#content').innerHTML += data.data;
  };
}

connectWebsocket()

后端代码

wss.on('connection', function connection(ws, req) {
    ws.req = req;
    ws.sendJson = function (json) {
      if (this.readyState == 1) {
        this.send(JSON.stringify(json))
      }
    }
    ws.on('message', function (message) {
      message = JSON.parse(message);
      switch (message.type) {
        case 'setSocketId':
          ws.socketId = message.data;
          console.log(ws.socketId)
          break;
      }
    });
});
app.post('/api/socket/msg', function (req, res) {
    var query = req.body;
    console.log(query)

    var socketId = req.cookies.socketId;

    res.wss.clients.forEach(ws => {
      if (ws.socketId == socketId && ws.readyState == 1) {
        ws.sendJson({
          type:'testMsg',
          data:query.msg
        });
      }
    })

    res.send({})
})

完整例子
demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript之appendChild、insertBefore和insertAfter使用说明
Dec 30 Javascript
基于javascipt-dom编程 table对象的使用
Apr 22 Javascript
JavaScript中的字符串操作详解
Nov 12 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
Jun 21 Javascript
详解通过JSON数据使用VUE.JS
May 26 Javascript
基于对象合并功能的实现示例
Oct 10 Javascript
bootstrap3中container与container_fluid外层容器的区别讲解
Dec 04 Javascript
浅谈Vue Element中Select下拉框选取值的问题
Mar 01 Javascript
详解如何使用babel进行es6文件的编译
May 29 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
Aug 20 Javascript
JavaScript canvas实现跟随鼠标事件
Feb 10 Javascript
Vue中通过vue-router实现命名视图的问题
Apr 23 Javascript
Vue快速实现通用表单验证的示例代码
Jan 09 #Javascript
JS实现商品橱窗特效
Jan 09 #Javascript
微信小程序实现页面浮动导航
Jan 08 #Javascript
微信小程序基于movable-view实现滑动删除效果
Jan 08 #Javascript
小程序自定义模板实现吸顶功能
Jan 08 #Javascript
微信小程序静默登录的实现代码
Jan 08 #Javascript
微信小程序wxs实现吸顶效果
Jan 08 #Javascript
You might like
使用YUI+Ant 实现JS CSS压缩
2014/09/02 PHP
php实现根据字符串生成对应数组的方法
2014/09/22 PHP
分享PHP守护进程类
2015/12/30 PHP
Javascript面向对象设计一 工厂模式
2011/12/20 Javascript
jQuery 中DOM 操作详解
2015/01/13 Javascript
jquery手风琴特效插件
2015/02/04 Javascript
JavaScript中使用Math.floor()方法对数字取整
2015/06/15 Javascript
jquery.serialize() 函数语法及简单实例
2016/07/08 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
Javascript实现跨域后台设置拦截的方法详解
2017/08/04 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
弱类型语言javascript开发中的一些坑实例小结【变量、函数、数组、对象、作用域等】
2019/08/07 Javascript
vue使用高德地图根据坐标定位点的实现代码
2019/08/22 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
javascript实现前端成语点击验证
2020/06/24 Javascript
vant-ui框架的一个bug(解决切换后onload不触发)
2020/11/11 Javascript
python self,cls,decorator的理解
2009/07/13 Python
Python语言编写电脑时间自动同步小工具
2013/03/08 Python
Python使用正则表达式抓取网页图片的方法示例
2017/04/21 Python
python数据批量写入ScrolledText的优化方法
2018/10/11 Python
Python中拆分字符串的操作方法
2019/07/23 Python
django将网络中的图片,保存成model中的ImageField的实例
2019/08/07 Python
python os.path.isfile 的使用误区详解
2019/11/29 Python
python随机生成大小写字母数字混合密码(仅20行代码)
2020/02/01 Python
Python3 Click模块的使用方法详解
2020/02/12 Python
世界最大的私人旅行指南出版商:孤独星球
2016/08/23 全球购物
老师推荐信
2013/10/28 职场文书
学生社团文化节开幕式主持词
2014/03/28 职场文书
研讨会通知
2015/04/27 职场文书
陪护人员误工证明
2015/06/24 职场文书
OpenCV绘制圆端矩形的示例代码
2021/08/30 Python
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL
SQL Server使用T-SQL语句批处理
2022/05/20 SQL Server
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技