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 相关文章推荐
aspx中利用js实现确认删除代码
Jul 22 Javascript
node.js中的events.emitter.removeAllListeners方法使用说明
Dec 10 Javascript
javascript正则表达式使用replace()替换手机号的方法
Jan 19 Javascript
C++中的string类的用法小结
Aug 07 Javascript
JS正则表达式比较常见用法
Jan 26 Javascript
JQuery给select添加/删除节点的实现代码
Apr 26 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
Jul 05 Javascript
Vue.js实现简单动态数据处理
Feb 13 Javascript
解决jquery appaend元素中id绑定事件失效的问题
Sep 12 jQuery
jQuery实现弹出层效果
Dec 10 jQuery
微信小程序去除左上角返回键的实现方法
Mar 06 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
Nov 05 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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
PHP迅雷、快车、旋风下载专用链转换代码
2010/06/15 PHP
php递归方法实现无限分类实例代码
2014/02/28 PHP
Yii2创建多界面主题(Theme)的方法
2016/10/08 PHP
PHP让网站移动访问更加友好方法
2019/02/14 PHP
phpStorm+XDebug+chrome 配置详解
2019/04/01 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
js css样式操作代码(批量操作)
2009/10/09 Javascript
Javascript 模式实例 观察者模式
2009/10/24 Javascript
Jquery中Ajax 缓存带来的影响的解决方法
2011/05/19 Javascript
jQuery设置div一直在页面顶部显示的方法
2013/10/24 Javascript
js实现简单的验证码
2015/12/25 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
Vue计算属性的学习笔记
2017/03/22 Javascript
Vue数据双向绑定原理及简单实现方法
2018/05/18 Javascript
python的绘图工具matplotlib使用实例
2014/07/03 Python
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
python通过索引遍历列表的方法
2015/05/04 Python
Flask数据库迁移简单介绍
2017/10/24 Python
tensorflow学习笔记之mnist的卷积神经网络实例
2018/04/15 Python
Django框架实现的简单分页功能示例
2018/12/04 Python
python3中类的继承以及self和super的区别详解
2019/06/26 Python
python opencv捕获摄像头并显示内容的实现
2019/07/11 Python
tensor和numpy的互相转换的实现示例
2019/08/02 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
把vgg-face.mat权重迁移到pytorch模型示例
2019/12/27 Python
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
Notino法国:购买香水和化妆品
2019/04/15 全球购物
如何在存储过程中使用Loop
2016/01/05 面试题
质量整改报告范文
2014/11/08 职场文书
实习工作表现评语
2014/12/31 职场文书
保研导师推荐信
2015/03/25 职场文书
与死神共舞观后感
2015/06/15 职场文书
导游词之潮音寺
2019/09/26 职场文书
Python使用DFA算法过滤内容敏感词
2022/04/22 Python
Win10多屏显示如何设置?Win10电脑多屏显示设置操作方法
2022/07/07 数码科技