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(视频与PPT)
Dec 27 Javascript
jQuery 学习6 操纵元素显示效果的函数
Feb 07 Javascript
jquery formValidator插件ajax验证 内容不做任何修改再离开提示错误的bug解决方法
Jan 04 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
Feb 19 Javascript
Jquery easyUI 更新行示例
Mar 06 Javascript
批量修改标签css样式以input标签为例
Jul 31 Javascript
基于编写jQuery的无缝滚动插件
Aug 02 Javascript
angularJS 中input示例分享
Feb 09 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
May 10 Javascript
浅析jQuery中使用$所引发的问题
May 29 Javascript
RxJS的入门指引和初步应用
Jun 15 Javascript
React Native 混合开发多入口加载方式详解
Sep 23 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
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
PHP动态柱状图实现方法
2015/03/30 PHP
PHP仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(上)
2017/05/26 PHP
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
jQuery:节点(插入,复制,替换,删除)操作
2013/03/04 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
js事件监听器用法实例详解
2015/06/01 Javascript
jquery实现鼠标滑过显示二级下拉菜单效果
2015/08/24 Javascript
基于jquery插件编写countdown计时器
2016/06/12 Javascript
原生JS轮播图插件
2017/02/09 Javascript
微信分享调用jssdk实例
2017/06/08 Javascript
JavaScript创建对象_动力节点Java学院整理
2017/06/27 Javascript
layui中layer前端组件实现图片显示功能的方法分析
2017/10/13 Javascript
老生常谈JS中的继承及实现代码
2018/07/06 Javascript
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
微信小程序使用wxParse解析html的实现示例
2018/08/30 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
如何实现iframe父子传参通信
2020/02/05 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
[03:11]不朽宝藏三外观展示
2020/09/18 DOTA
Python在图片中添加文字的两种方法
2017/04/29 Python
python opencv 批量改变图片的尺寸大小的方法
2019/06/28 Python
python plotly绘制直方图实例详解
2019/07/22 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
python 实现关联规则算法Apriori的示例
2020/09/30 Python
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
美国婚礼礼品网站:MyWeddingFavors
2018/09/26 全球购物
公务员总结性个人自我评价
2013/12/05 职场文书
乡镇精神文明建设汇报材料
2014/08/15 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
公司员工奖惩制度
2015/08/04 职场文书
MongoDB安装使用并实现Python操作数据库
2021/06/28 MongoDB
关于python中模块和重载的问题
2021/11/02 Python
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python