位置: IT常识 - 正文

WebSocket实现后端数据变化,通知前端实时更新数据(websocket基于http)

编辑:rootadmin
WebSocket实现后端数据变化,通知前端实时更新数据 背景

推荐整理分享WebSocket实现后端数据变化,通知前端实时更新数据(websocket基于http),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:websocket 前后端,websocket需要后端配合吗,websocket socket,websocketjs,websocket接口后端怎么调用,websocket hook,websocket socket,websocket hook,内容如对您有帮助,希望把文章链接给更多的朋友!

​ 项目中需要做一个消息提示功能,当有用户处理相关待办信息后,别的用户需要实时更新处理后的待办信息。

解决方案:

​ 1、使用最原始的方法,写个定时器去查询待办信息。但这种方式在大多数情况是不被允许的,它会浪费系统中的许多资源,同时也并不是完全意义上的实时更新。

​ 2、使用WebSocket通信技术去实现一个实时更新,它可以实现广播和私信的模式。当一个用户与WebSocket服务建立连接后,用户可以给它发送一个消息,此时WebSocket服务会接收到这个消息并做出回信(此时可以回信给所有与其建立连接的用户——广播,也可以回信给指定用户——私信)。接下来将从前后端去讲解WebSocket的使用。

一、WebSocket服务的搭建(SpringBoot后端)

SpringBoot自带的WebSocket有以下5个注解需要注意:

@ServerEndpoint

暴露出的ws应用的路径,支持RESTful风格传参,类似/websocket/{username}

@OnOpen

与当前客户端连接成功,有入参Session对象(当前连接对象),同时可以利用@PathParam()获取上述应用路径中传递的参数,比如@PathParam(“username”) String username。

@OnClose

WebSocket实现后端数据变化,通知前端实时更新数据(websocket基于http)

与当前客户端连接失败,有入参Session对象(当前连接对象),同时也可以利用@PathParam()获取上述应用路径中传递的参数。

@OnError

与当前客户端连接异常,有入参Session对象(当前连接对象)、Throwable对象(异常对象),同时也可以利用@PathParam()获取上述应用路径中传递的参数。

@OnMessage

当前客户端发送消息,有入参Session对象(当前连接对象)、String message对象(当前客户端传递过来的字符串消息)

1、引入所需依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId></dependency>2、使用自定义类开启WebSocketimport org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.socket.config.annotation.EnableWebSocket;import org.springframework.web.socket.server.standard.ServerEndpointExporter;/** * @program: webSocketTest * @description: WebSocket相关配置 * @author: 黄珺瑜 * @create: 2022-06-30 16:24 **/@Configuration@EnableWebSocketpublic class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); }}3、配置WebSocket服务import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import javax.websocket.*;import javax.websocket.server.ServerEndpoint;import java.io.IOException;import java.util.Map;import java.util.Set;import java.util.concurrent.ConcurrentHashMap;/** * @program: webSocketTest * @description: WebSocket服务 * @author: 黄珺瑜 * @create: 2022-06-30 16:25 **/@Component@Slf4j@ServerEndpoint("/websocket") //暴露的ws应用的路径public class WebSocket { // 用来存储服务连接对象 private static Map<String ,Session> clientMap = new ConcurrentHashMap<>(); /** * 客户端与服务端连接成功 * @param session */ @OnOpen public void onOpen(Session session){ /* do something for onOpen 与当前客户端连接成功时 */ clientMap.put(session.getId(),session); } /** * 客户端与服务端连接关闭 * @param session */ @OnClose public void onClose(Session session){ /* do something for onClose 与当前客户端连接关闭时 */ clientMap.remove(session.getId()); } /** * 客户端与服务端连接异常 * @param error * @param session */ @OnError public void onError(Throwable error,Session session) { error.printStackTrace(); } /** * 客户端向服务端发送消息 * @param message * @throws IOException */ @OnMessage public void onMsg(Session session,String message) throws IOException { /* do something for onMessage 收到来自当前客户端的消息时 */ sendAllMessage(message); } //向所有客户端发送消息(广播) private void sendAllMessage(String message){ Set<String> sessionIdSet = clientMap.keySet(); //获得Map的Key的集合 // 此处相当于一个广播操作 for (String sessionId : sessionIdSet) { //迭代Key集合 Session session = clientMap.get(sessionId); //根据Key得到value session.getAsyncRemote().sendText(message); //发送消息给客户端 } }}二、与WebSocket服务建立连接(Vue前端)

WebSocket是js自带的一个对象,所以此处不需要任何引入第三方依赖包的操作。

WebSocket对象讲解:

创建WebSocket对象

const ws = new WebSocket('ws://127.0.0.1:8088/websocket')// WebSocket服务的建立需要使用ws协议或者wss协议

onopen事件监听

// 建立连接后的回调函数openCallback(e){ console.log('与服务端连接打开->',e)}

onerror事件监听

// 连接异常后的回调函数errorCallback(e){ console.log('与服务端连接打开->',e)}

onclose事件监听

// 关闭连接的回调函数closeCallback(e){ console.log('与服务端连接打开->',e)}

onmessage事件监听

// 接收到服务端的回信后的回调函数messageCallback(e){ console.log('与服务端连接打开->',e)}1、包装后的webSocket.js/** * 参数说明: * webSocketURL:String webSocket服务地址 eg: ws://127.0.0.1:8088/websocket (后端接口若为restful风格可以带参数) * callback:为带一个参数的回调函数 * message:String 要传递的参数值(不是一个必要的参数) */export default{ // 初始化webSocket webSocketInit(webSocketURL){ // ws://127.0.0.1:8088/websocket this.webSocket = new WebSocket(webSocketURL); this.webSocket.onopen = this.onOpenwellback; this.webSocket.onmessage = this.onMessageCallback; this.webSocket.onerror = this.onErrorCallback; this.webSocket.onclose = this.onCloseCallback; }, // 自定义回调函数 setOpenCallback(callback){ // 与服务端连接打开回调函数 this.webSocket.onopen = callback; }, setMessageCallback(callback){ // 与服务端发送消息回调函数 this.webSocket.onmessage = callback; }, setErrorCallback(callback){ // 与服务端连接异常回调函数 this.webSocket.onerror = callback; }, setCloseCallback(callback){ // 与服务端连接关闭回调函数 this.webSocket.onclose = callback; }, close(){ // 关闭连接 this.webSocket.close(); }, sendMessage(message){ // 发送消息函数 this.webSocket.send(message); },}2、Vue中WebSocket对象的使用<template> <el-button type="primary" @click="sendMessage">发送消息</el-button></template><script>import webSocket from '@/api/evgis/webSocket'export default { name:"WebSocketTest", data(){ return{ webSocketObject: null, } }, created() { // webSocket.webSocketInit(process.env.VUE_APP_BASE_API.replace("http","ws")+"/evgis/todoStatus") webSocket.webSocketInit('ws://127.0.0.1:8088/websocket')//初始化webSocket // 按需进行绑定回调函数 webSocket.setOpenCallback(res=>{ console.log("连接建立成功",res); }) webSocket.setMessageCallback(res=>{ // 在此处进行数据刷新操作即可实现数据发生改变时实时更新数据 console.log("接收到回信",res); }) webSocket.setErrorCallback(res=>{ console.log("连接异常",res); }) webSocket.setCloseCallback(res=>{ console.log("连接关闭",res); }) }, methods:{ sendMessage(){ // 数据发生改变时给WebSocket发送消息,让其进行广播操作 webSocket.sendMessage(); } }}</script><style></style>三、实践时遇到困难1、由于使用的时若依框架,配置好WebSocket服务后需要开放出ws的服务地址,否则会提示未带token,WebSocket连接不上。2、在配置WebSocket服务时,没有在关闭连接方法中移除连接对象。导致建立WebSocket连接后一发送消息就断开连接。

参考文章:前后端使用利用WebSocket进行通信、服务器推送消息到前端实现页面数据实时刷新-分布式Websocket技术方案

本文链接地址:https://www.jiuchutong.com/zhishi/298263.html 转载请保留说明!

上一篇:vscode里面使用vue的一些插件,方便开发(vue vscode snippets)

下一篇:图解cross attention(涌泉的准确位置图 图解)

  • 论坛应该怎么发帖,发什么样的帖子提升论坛的人气(论坛应该怎么发文案)

    论坛应该怎么发帖,发什么样的帖子提升论坛的人气(论坛应该怎么发文案)

  • 鸿蒙系统怎么结束进程(鸿蒙系统技巧)

    鸿蒙系统怎么结束进程(鸿蒙系统技巧)

  • 小米civi支持内存卡吗(小米civi详细配置)

    小米civi支持内存卡吗(小米civi详细配置)

  • 苹果13外壳材质(苹果13外壳材质容易碎吗)

    苹果13外壳材质(苹果13外壳材质容易碎吗)

  • 抖音上传视频怎么删掉(抖音上传视频怎么没有美颜功能)

    抖音上传视频怎么删掉(抖音上传视频怎么没有美颜功能)

  • 专为电视开发的多媒体接口是什么(自己开发电视端视频app)

    专为电视开发的多媒体接口是什么(自己开发电视端视频app)

  • 华为p40怎么辨别真假(华为p40怎么辨别维修过的机器)

    华为p40怎么辨别真假(华为p40怎么辨别维修过的机器)

  • 南孚电池怎么看几号(南孚电池怎么看大小)

    南孚电池怎么看几号(南孚电池怎么看大小)

  • 车票信息已过期什么意思(12306车票信息已过期什么意思)

    车票信息已过期什么意思(12306车票信息已过期什么意思)

  • oppo r11上市日期(oppo r11那年上市的)

    oppo r11上市日期(oppo r11那年上市的)

  • wifi改密码后连不上网怎么办(wifi改了密码后连接不了)

    wifi改密码后连不上网怎么办(wifi改了密码后连接不了)

  • 微信京东购物黑屏怎么回事(京东微信平台)

    微信京东购物黑屏怎么回事(京东微信平台)

  • .epub是什么文件(epub是什么文件格式可以打印吗)

    .epub是什么文件(epub是什么文件格式可以打印吗)

  • 门禁卡nfc功能是什么意思(门禁卡nfc功能是什么)

    门禁卡nfc功能是什么意思(门禁卡nfc功能是什么)

  • 快手注销账号一般几天之内(快手注销账号一定会成功吗)

    快手注销账号一般几天之内(快手注销账号一定会成功吗)

  • 小米一键换机要插卡吗(小米一键换机要注意什么)

    小米一键换机要插卡吗(小米一键换机要注意什么)

  • 抖音怎么才能发长视频(抖音怎么才能发微信朋友圈)

    抖音怎么才能发长视频(抖音怎么才能发微信朋友圈)

  • 饿了么订单怎么删除(饿了么订单怎么查看送达时间)

    饿了么订单怎么删除(饿了么订单怎么查看送达时间)

  • 微信商家码和个人码区别(微信商家码和个人码图片)

    微信商家码和个人码区别(微信商家码和个人码图片)

  • vivoox23是防水的吗(vivox21a防水性能)

    vivoox23是防水的吗(vivox21a防水性能)

  • word文档字体怎么放大居中(word文档字体怎么翻转方向)

    word文档字体怎么放大居中(word文档字体怎么翻转方向)

  • 今日头条如何申请原创(今日头条如何申请认证)

    今日头条如何申请原创(今日头条如何申请认证)

  • 升级windows10专业版详细方法(升级win10到专业版)

    升级windows10专业版详细方法(升级win10到专业版)

  • 安博塞利国家公园的大象,肯尼亚 (© Adam Bannister/Offset)(安博塞利国家公园狮子)

    安博塞利国家公园的大象,肯尼亚 (© Adam Bannister/Offset)(安博塞利国家公园狮子)

  • 【GPT-3】第2章 使用 OpenAI API(gpt3 transformer)

    【GPT-3】第2章 使用 OpenAI API(gpt3 transformer)

  • 税务清算需要什么条件
  • 哪些费用可在缴纳医保
  • 收到银行存兑汇票
  • 记账凭证背面怎么填写
  • 个人独资企业注册流程
  • 公司购买厂房需要交房产税吗
  • 空调损坏
  • 赠品的会计核算内容
  • 未投入使用房屋怎么处理
  • 应付股利科目设置
  • 企业长期股权投资中发生的相关费用处理方法正确的有
  • 未分配利润的计税基础是
  • 税控盘白盘和黑盘图标
  • 2008版增值税普通发票图片
  • 关于开票时纳税的规定
  • 未休假报酬需要报个税吗
  • 税务机关代开的普通发票上无需加盖收款方的印章
  • 文化用品有哪些种类
  • 健身房属于什么经营类别
  • 商品流通企业会计零售业务核算
  • 辅助生产费用的归集
  • 预提返利的会计处理
  • 应收账款转营业外收入怎么写申请
  • 金蝶核算项目明细表
  • 华硕主板进入bios设置
  • 补发票需要什么东西
  • 美团收入怎么处理的?
  • 购入成品油怎么做会计分录
  • node.js和npm
  • 销售人员奖励办法
  • 本年利润和未分配利润怎么结转
  • 支付报刊杂志费
  • 融资性租赁会计处理计入固定资产
  • php的strcmp
  • 控制系统动力学
  • css选择器分哪几类
  • [Vue warn]: Error in render: “TypeError: Cannot read properties of undefined(reading“category1Name“
  • react js 教程
  • java rest接口
  • 怎么在网上增加办税人员
  • 记账凭证的记账符号要打勾吗
  • 外包员工食堂怎么做账
  • 汉诺塔问题动画演示
  • 商铺转让费的会计分录
  • 有下列情形之一的,当事人可以解除
  • 公司名下的车怎样领免检标志
  • 记账金额怎么写
  • 销售货物增值税税率变化
  • 出口退税的发票是专票还是普票
  • 残疾人就业保障金是什么意思啊
  • 绿植租赁怎么开票
  • 公司是生产企业现在要开出租赁的发票可以开吗
  • 企业清算未收到发票
  • 代扣职工个人所得税的账务处理
  • 车票如何抵扣增值税
  • 在保险中,保险利益的载体是
  • 金税盘的维护费每年怎么抵扣
  • 事业单位无形资产包括哪些
  • 财务费用中的利息费用指什么
  • 坏账准备转回是什么意思
  • 研发费用占销售的比例
  • 买入返售金融资产 流动资产
  • ubuntu唤醒快捷键
  • Ubuntu 12.04安装Xen常见问题及解决方法汇总
  • windowxp怎么设置密码
  • xp系统访问局域网
  • win10 打开文件
  • 升级win10怎么激活
  • linux系统获取dhcp地址
  • win7隐藏文件怎么调出来
  • cocos2dx怎么用
  • scrollWidth,clientWidth与offsetWidth的区别
  • 求婚表白怎么说怎么写
  • 简单谈谈对电信的认识
  • python 遍历字符串修改
  • 计算字符串的长度使用哪个函数?
  • 浏览器窗口上线怎么办
  • 上海地铁和公交乘车码
  • 郑州房产契税缴纳
  • 合伙企业取得的专利权属于合伙企业财产吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设