位置: 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(涌泉的准确位置图 图解)

  • 电视极光tv怎么退出登录

    电视极光tv怎么退出登录

  • 小米9se可以人脸解锁吗(小米9se有人脸解锁吗)

    小米9se可以人脸解锁吗(小米9se有人脸解锁吗)

  • 电脑声音怎么调(笔记本电脑声音怎么调)

    电脑声音怎么调(笔记本电脑声音怎么调)

  • 华为p30pro分屏在哪里设置(华为p30pro能分屏)

    华为p30pro分屏在哪里设置(华为p30pro能分屏)

  • 微信人脸识别未授权怎么解决(微信人脸识别未包含身份信息)

    微信人脸识别未授权怎么解决(微信人脸识别未包含身份信息)

  • excel如何选中第一行到最后一行(Excel如何选中第三万行)

    excel如何选中第一行到最后一行(Excel如何选中第三万行)

  • c语言中d%是什意思(c语言中是什么意思)

    c语言中d%是什意思(c语言中是什么意思)

  • 出现解除关系加为好友(解除 关系)

    出现解除关系加为好友(解除 关系)

  • 空气切割机是什么镜头(空气切割是不是空气斩)

    空气切割机是什么镜头(空气切割是不是空气斩)

  • 滴滴注销了还能注册吗(滴滴注销了还能重新注册几次)

    滴滴注销了还能注册吗(滴滴注销了还能重新注册几次)

  • 抖音改昵称有什么限制(抖音改昵称什么好听单身女孩)

    抖音改昵称有什么限制(抖音改昵称什么好听单身女孩)

  • 标识符第一个字符必须是(标识符第一个字符不能是数字)

    标识符第一个字符必须是(标识符第一个字符不能是数字)

  • wifi6向下兼容吗(wifi6向下兼容wifi4吗)

    wifi6向下兼容吗(wifi6向下兼容wifi4吗)

  • 苹果更新系统一直白屏(苹果更新系统一直在准备更新)

    苹果更新系统一直白屏(苹果更新系统一直在准备更新)

  • 小米社区是什么(小米社区是什么东西)

    小米社区是什么(小米社区是什么东西)

  • 对方把我拉黑了怎么加回来(对方把我拉黑了我的好友列表还有他吗)

    对方把我拉黑了怎么加回来(对方把我拉黑了我的好友列表还有他吗)

  • ios13.3怎么安装第三方软件(ios13怎么安装ipa)

    ios13.3怎么安装第三方软件(ios13怎么安装ipa)

  • 超级会员和qq会员的区别(超级会员和qq会员一样吗)

    超级会员和qq会员的区别(超级会员和qq会员一样吗)

  • vip到期缓存的还能看吗(vip缓存过期还能看吗)

    vip到期缓存的还能看吗(vip缓存过期还能看吗)

  • abdlog储存限制是什么(adblog储存大小限制是什么意思)

    abdlog储存限制是什么(adblog储存大小限制是什么意思)

  • ipad air3充电多久充满(ipad air3多久充满电)

    ipad air3充电多久充满(ipad air3多久充满电)

  • 计算机的特点及应用(计算机的特点及应用教学反思)

    计算机的特点及应用(计算机的特点及应用教学反思)

  • 显卡怎么检查是否坏了(显卡怎么检查是否损坏)

    显卡怎么检查是否坏了(显卡怎么检查是否损坏)

  • 趣分类怎么注销账号(趣分类已经注册过得怎么下载)

    趣分类怎么注销账号(趣分类已经注册过得怎么下载)

  • 手机号码显示公司怎么取消(手机号码显示公司名称怎样取消)

    手机号码显示公司怎么取消(手机号码显示公司名称怎样取消)

  • 华为watch2pro怎么使用浏览器(华为watch2pro怎么连接手机)

    华为watch2pro怎么使用浏览器(华为watch2pro怎么连接手机)

  • 华为nova5pro和nova5有什么区别(华为nova5pro和nova7pro哪个好)

    华为nova5pro和nova5有什么区别(华为nova5pro和nova7pro哪个好)

  • mgavrtcl.exe进程查询 作用是什么 mgavrtcl进程查询(进程查看工具)

    mgavrtcl.exe进程查询 作用是什么 mgavrtcl进程查询(进程查看工具)

  • 车间停止生产时间怎么计算
  • 个税专项附加继续教育
  • 医院能否开具增值税专用发票
  • 没有上市的公司怎么看财务报表
  • 同一法人的两家企业可以以同一投标人身份投标吗
  • 非货币性资产交换准则
  • 支票报销是怎么操作的
  • 用友如何结转本年利润到未分配利润
  • 金税三期个人所得税税率
  • 出口关税如何做账
  • 委托其他公司开票收款
  • 全年一次性奖金计税方式
  • 收到的专票都必须开吗
  • 核定征收的企业需要汇算清缴吗
  • 机票上exempt yqcny是什么意思?
  • 机票进项税额怎么申报
  • 企业营业利润为负的原因有哪些
  • 打车进项可以抵扣吗
  • 简易计税开票开成了一般计税的税率会比对不通过吗
  • u盘的内存卡怎么装
  • docker搭建php
  • 一般纳税人出售旧设备的税率
  • 期间费用的会计科目
  • el-upload上传文件大小限制
  • 一文读懂谢娜张杰购房跳单事件始末
  • 建筑工程合同生效的条件有哪些?
  • 怎么分析一个企业的营销策略
  • 百慕大玛丽号
  • 机器学习中的数据预处理方法与步骤
  • 维保服务的税率是多少
  • php数组实现原理
  • 个人往来款如何转为公司股权
  • 数字图像处理期末试卷及答案
  • zabbix 执行命令
  • 营业外支出是什么会计要素
  • 商品过期的会计分录
  • 调账处理
  • 补开上年发票的税务处理要怎么做?
  • php验证码源码
  • centos7.9 防火墙
  • 帝国cms结合项多选
  • 小规模纳税人是个体户吗
  • 无锡政府回购安置房
  • 跨年认证原材料是什么
  • 未能确认收入的原因
  • 用sql语言
  • 日记总账的适用范围
  • 出售固定资产应收账款
  • 纳税人企业本月纳税额
  • 建筑业普票与专票怎么抵扣
  • 小规模纳税人减按1%如何填报申报表
  • 预付卡销售成品油会计分录
  • 外汇收入需要缴纳增值税吗
  • 生产成本有贷方余额怎么调整
  • 税务机关多收税款几年可以要求退回
  • 红冲暂估原材料如何做会计分录
  • 差旅费算人工费吗
  • 废料入库如何估价
  • 外出参加会议费用怎么做账
  • 短期借款明细账采用什么格式
  • 没有发票的福利费支出可以税前扣除吗
  • 时段与时点
  • 错误的原始凭证是什么
  • sqlserver登录日志
  • sql的all和any
  • Windows Server 2008故障转移群集简介
  • centos 3
  • mac连电视
  • centos6.x下安装maven CentOS自动安装Maven的方法
  • 获取windows的最新信息
  • 怎么打开windows移动中心
  • django ajax请求
  • js实现滑动效果
  • 简述activity的生命周期中有哪几种状态
  • 加计抵减怎么计提分录
  • 工会经费计税依据工资总额包括什么
  • 小规模纳税人税费怎么算
  • 浪潮报销软件安装
  • 预测收入遵循什么方法
  • 湖南省水利建设基金
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设