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 相关文章推荐
jquery 1.4.2发布!主要是性能与API
Feb 25 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
Aug 03 Javascript
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
Jun 22 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
Sep 19 Javascript
js 判断一个元素是否在页面中存在
Dec 27 Javascript
利用jquery包将字符串生成二维码图片
Sep 12 Javascript
Jquery的each里用return true或false代替break或continue
May 21 Javascript
js判断变量初始化的三种形式及推荐用的形式
Jul 22 Javascript
Javascript Object 对象学习笔记
Dec 17 Javascript
Bootstrap项目实战之首页内容介绍(全)
Apr 25 Javascript
Javascript 链式作用域详细介绍
Feb 23 Javascript
vue 页面回退mounted函数不执行的解决方案
Jul 26 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
无线电波是什么?它是怎样传输的?
2021/03/01 无线电
thinkPHP模型初始化实例分析
2015/12/03 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
Expandable "Detail" Table Rows
2007/08/29 Javascript
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
c#和Javascript操作同一json对象的实现代码
2012/01/17 Javascript
jquery插件制作教程 txtHover
2012/08/17 Javascript
js锁屏解屏通过对$.ajax进行封装实现
2014/07/31 Javascript
js中的事件捕捉模型与冒泡模型实例分析
2015/01/10 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
javascript常用的方法整理
2015/08/20 Javascript
javascript检测flash插件是否被禁用的方法
2016/01/14 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
在js中做数字字符串补0(js补零)
2017/03/25 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
vue-cli 3.0 自定义vue.config.js文件,多页构建的方法
2018/09/19 Javascript
JS数组属性去重并校验重复数据
2020/01/10 Javascript
通过javascript实现扫雷游戏代码实例
2020/02/09 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
vue+vuex+axios从后台获取数据存入vuex,组件之间共享数据操作
2020/07/31 Javascript
[01:02:48]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Liquid
2018/04/03 DOTA
[02:53]2018年度DOTA2最佳战队-完美盛典
2018/12/17 DOTA
python单例模式实例分析
2015/04/08 Python
Python实现抢购IPhone手机
2018/02/07 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
wxPython实现带颜色的进度条
2019/11/19 Python
Django后端发送小程序微信模板消息示例(服务通知)
2019/12/17 Python
Python持续监听文件变化代码实例
2020/07/22 Python
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
贝玲妃美国官方网站:Benefit美国
2016/08/28 全球购物
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
params有什么用
2016/03/01 面试题
学期自我鉴定范文
2013/10/01 职场文书
简历里的自我评价范文
2014/02/24 职场文书