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 相关文章推荐
飞鱼(shqlsl) javascript作品集
Dec 16 Javascript
javascript Window及document对象详细整理
Jan 12 Javascript
HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天
Oct 31 Javascript
详解JS去重及字符串奇数位小写转大写
Dec 29 Javascript
angularJs的ng-class切换class
Jun 23 Javascript
基于vue的短信验证码倒计时demo
Sep 13 Javascript
vue中配置mint-ui报css错误问题的解决方法
Oct 11 Javascript
vue iview组件表格 render函数的使用方法详解
Mar 15 Javascript
jquery 动态遍历select 赋值的实例
Sep 12 jQuery
详解在vue-cli项目下简单使用mockjs模拟数据
Oct 19 Javascript
Vue.js组件间通信方式总结【推荐】
Nov 23 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
Apr 16 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自动给网址加上链接的方法
2015/06/02 PHP
php下载文件超时时间的设置方法
2016/10/06 PHP
js 分栏效果实现代码
2009/08/29 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
javascript for循环设法提高性能
2010/02/24 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
JS中mouseover和mouseout多次触发问题如何解决
2016/06/06 Javascript
基于Vue.js实现数字拼图游戏
2016/08/02 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
用jQuery实现优酷首页轮播图
2017/01/09 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
快速使用node.js进行web开发详解
2017/04/26 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
JS实现盒子拖拽效果
2020/02/06 Javascript
查找Vue中下标的操作(some和findindex)
2020/08/12 Javascript
[01:04:01]2014 DOTA2华西杯精英邀请赛5 24 DK VS VG
2014/05/25 DOTA
Python实例一个类背后发生了什么
2016/02/09 Python
python二分查找算法的递归实现方法
2016/05/12 Python
python正则表达式re之compile函数解析
2017/10/25 Python
python的Tqdm模块的使用
2018/01/10 Python
python 实现判断ip连通性的方法总结
2018/04/22 Python
python matlibplot绘制3D图形
2018/07/02 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
使用python快速在局域网内搭建http传输文件服务的方法
2019/11/14 Python
浅谈spring boot 集成 log4j 解决与logback冲突的问题
2020/02/20 Python
python实现五子棋程序
2020/04/24 Python
python 实现简单的计算器(gui界面)
2020/11/11 Python
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
教学改革实施方案
2014/03/31 职场文书
个人诉讼委托书范本
2014/10/17 职场文书
自愿离婚协议书范本2016
2016/03/18 职场文书
python scipy 稀疏矩阵的使用说明
2021/05/26 Python
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL