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 相关文章推荐
3Z版基于jquery的图片复选框(asp.net+jquery)
Apr 12 Javascript
Jquery阻止事件冒泡 event.stopPropagation
Dec 11 Javascript
JS 在指定数组中随机取出N个不重复的数据
Jun 10 Javascript
浅谈javascript属性onresize
Apr 20 Javascript
swtich/if...else的替代语句
Aug 16 Javascript
jQuery实现的精美平滑二级下拉菜单效果代码
Mar 28 Javascript
jQuery fadeOut 异步实例代码详解
Aug 18 Javascript
微信小程序 wxapp导航 navigator详解
Oct 31 Javascript
layui select获取自定义属性方法
Aug 15 Javascript
vue+elementUI实现图片上传功能
Aug 20 Javascript
解决layer弹出层中表单不起作用的问题
Sep 09 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
Jan 20 Vue.js
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的栏目导航程序
2006/10/09 PHP
php快递单号查询接口使用示例
2014/05/05 PHP
WordPress中用于获取及自定义头像图片的PHP脚本详解
2015/12/17 PHP
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
关于页面嵌入swf覆盖div层的问题的解决方法
2014/02/11 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
JQuery动态添加和删除表格行的方法
2015/03/09 Javascript
jquery插件bxslider用法实例分析
2015/04/16 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
基于Layer+jQuery的自定义弹框
2020/05/26 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
Vue程序调试的方法
2019/06/17 Javascript
vue父子组件通信的高级用法示例
2019/08/29 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
在Python的循环体中使用else语句的方法
2015/03/30 Python
简单了解什么是神经网络
2017/12/23 Python
使用matplotlib中scatter方法画散点图
2019/03/19 Python
css3实现冲击波效果的示例代码
2018/01/11 HTML / CSS
美国气象仪器、花园装饰和墙壁艺术商店:Wind & Weather
2019/05/29 全球购物
SQL中where和having的区别
2012/06/17 面试题
开学典礼主持词
2014/03/19 职场文书
元旦晚会主持词
2014/03/24 职场文书
门前三包责任书
2014/04/15 职场文书
代理协议书
2014/04/22 职场文书
股东授权委托书
2014/10/15 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
小学生成绩单评语
2014/12/31 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js
JavaWeb Servlet开发注册页面实例
2022/04/11 Java/Android