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替换table中的内容并显示进度条的代码
Aug 02 Javascript
javascript中怎么做对象的类型判断
Nov 11 Javascript
JavaScript中双叹号!!作用示例介绍
Sep 21 Javascript
JavaScript实现算术平方根算法-代码超简单
Sep 11 Javascript
微信小程序动态显示项目倒计时效果
Jun 13 Javascript
JS运动特效之任意值添加运动的方法分析
Jan 24 Javascript
mint-ui在vue中的使用示例
Apr 05 Javascript
Vue项目引进ElementUI组件的方法
Nov 11 Javascript
javascript中call()、apply()的区别
Mar 21 Javascript
JS多个异步请求 按顺序执行next实现解析
Sep 16 Javascript
js 解析 JSON 数据简单示例
Apr 21 Javascript
我所理解的JavaScript中的this指向
Sep 04 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动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
php源码的使用方法讲解
2019/09/26 PHP
javascript smipleChart 简单图标类
2011/01/12 Javascript
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
node.js中的console用法总结
2014/12/15 Javascript
浅谈JavaScript变量的自动转换和语句
2016/06/12 Javascript
几行js代码实现自适应
2017/02/24 Javascript
javascript 玩转Date对象(实例讲解)
2017/07/11 Javascript
详解Vue学习笔记进阶篇之列表过渡及其他
2017/07/17 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
nodejs中用npm初始化来创建package.json的实例讲解
2018/10/10 NodeJs
JavaScript的词法结构精华篇
2018/10/17 Javascript
JS+php后台实现文件上传功能详解
2019/03/02 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
python使用正则表达式分析网页中的图片并进行替换的方法
2015/03/26 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
使用Python实现windows下的抓包与解析
2018/01/15 Python
python自动截取需要区域,进行图像识别的方法
2018/05/17 Python
python3解析库lxml的安装与基本使用
2018/06/27 Python
浅谈python中真正关闭socket的方法
2018/12/18 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
Django路由层URLconf作用及原理解析
2020/09/24 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
让IE下支持Html5的placeholder属性的插件
2014/09/02 HTML / CSS
大学英语专业求职信
2014/06/21 职场文书
2015年高校辅导员工作总结
2015/04/20 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
大学生自我鉴定怎么写
2019/05/07 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
Redis延迟队列和分布式延迟队列的简答实现
2021/05/13 Redis