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 45种缓动效果 非常酷
Jun 28 Javascript
JS去除右边逗号的简单方法
Jul 03 Javascript
弹出最简单的模式化遮罩层的js代码
Dec 04 Javascript
理解javascript中的回调函数(callback)
Sep 02 Javascript
js获取时间并实现字符串和时间戳之间的转换
Jan 05 Javascript
深入解析JavaScript中的数字对象与字符串对象
Oct 21 Javascript
jquery 获取select数组与name数组长度的实现代码
Jun 20 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
Nov 17 Javascript
js微信应用场景之微信音乐相册案例分享
Aug 11 Javascript
vue项目引入Iconfont图标库的教程图解
Oct 24 Javascript
vue组件系列之TagsInput详解
May 14 Javascript
vue treeselect获取当前选中项的label实例
Aug 31 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
PHP获取网卡地址的代码
2008/04/09 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
Laravel 5框架学习之Blade 简介
2015/04/08 PHP
js类中获取外部函数名的方法与代码
2007/09/12 Javascript
javascript新手语法小结
2008/06/15 Javascript
Jquery 跨域访问 Lightswitch OData Service的方法
2013/09/11 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
Jquery中扩展方法extend使用技巧
2014/08/24 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
令按钮悬浮在(手机)页面底部的实现方法
2017/05/02 Javascript
详谈js中标准for循环与foreach(for in)的区别
2017/11/02 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
详解Vue CLI 3.0脚手架如何mock数据
2018/11/23 Javascript
Python实现全局变量的两个解决方法
2014/07/03 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
Python求出0~100以内的所有素数
2018/01/23 Python
python实现彩色图转换成灰度图
2019/01/15 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
Lookfantastic香港官网:英国知名美妆购物网站
2018/06/19 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
高一生物教学反思
2014/01/17 职场文书
幼儿园托班开学寄语
2014/01/18 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
本科毕业自我鉴定
2014/03/20 职场文书
护士个人自我鉴定
2014/03/24 职场文书
车辆工程专业求职信
2014/06/14 职场文书
婚内房产协议书范本
2014/10/02 职场文书
初中生旷课检讨书范文
2014/10/06 职场文书
2016年小学优秀班主任事迹材料
2016/02/29 职场文书
sql注入教程之类型以及提交注入
2021/08/02 MySQL
MySQL创建定时任务
2022/01/22 MySQL
Win11运行育碧游戏总是崩溃怎么办 win11玩育碧游戏出现性能崩溃的解决办法
2022/04/06 数码科技
python语言中pandas字符串分割str.split()函数
2022/08/05 Python