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

  • 怎样装饰和运营好你的微博(怎么运营一个新开的装饰公司)

    怎样装饰和运营好你的微博(怎么运营一个新开的装饰公司)

  • iphone13怎么把面容换成指纹(苹果13怎么缩小屏幕)

    iphone13怎么把面容换成指纹(苹果13怎么缩小屏幕)

  • 剪映电脑版怎么添加背景画布(剪映电脑版怎么调倍速)

    剪映电脑版怎么添加背景画布(剪映电脑版怎么调倍速)

  • 快手小店我的评价在哪里能找到(快手小店我的评价怎么修改)

    快手小店我的评价在哪里能找到(快手小店我的评价怎么修改)

  • nova5pro怎么分屏(nova5pro怎么分屏操作)

    nova5pro怎么分屏(nova5pro怎么分屏操作)

  • 华为手机蓝牙连接汽车不能播放音乐(华为手机蓝牙连不上奔驰车)

    华为手机蓝牙连接汽车不能播放音乐(华为手机蓝牙连不上奔驰车)

  • 惠普227fdw硒鼓型号(惠普227fdw硒鼓加粉清零)

    惠普227fdw硒鼓型号(惠普227fdw硒鼓加粉清零)

  • 小米air2耳机怎么设置lhdc(小米air2耳机怎么配对)

    小米air2耳机怎么设置lhdc(小米air2耳机怎么配对)

  • z370兼容9代cpu吗(z370主板支持九代cpu吗?)

    z370兼容9代cpu吗(z370主板支持九代cpu吗?)

  • 电信4g显示hd什么意思(电信上面显示hd)

    电信4g显示hd什么意思(电信上面显示hd)

  • b940是几代处理器(b940处理器能装win10)

    b940是几代处理器(b940处理器能装win10)

  • iphone11突然黑屏怎么按都没反应(iphone11突然黑屏无法打开了)

    iphone11突然黑屏怎么按都没反应(iphone11突然黑屏无法打开了)

  • v1936a是什么手机型号(v2048a是什么手机)

    v1936a是什么手机型号(v2048a是什么手机)

  • 微信绑定卡如何更换姓名(微信绑定卡如何查询余额)

    微信绑定卡如何更换姓名(微信绑定卡如何查询余额)

  • 微信朋友圈怎么取消屏蔽(微信朋友圈怎么设置三天可见)

    微信朋友圈怎么取消屏蔽(微信朋友圈怎么设置三天可见)

  • 小米手机卸载的软件可以在哪里找回来(小米手机卸载的安装包怎么找回)

    小米手机卸载的软件可以在哪里找回来(小米手机卸载的安装包怎么找回)

  • 怎么在excel中查找关键字(怎么在excel中查重复项)

    怎么在excel中查找关键字(怎么在excel中查重复项)

  • 淘宝双十一什么时候开始预售(淘宝双十一什么时候结束)

    淘宝双十一什么时候开始预售(淘宝双十一什么时候结束)

  • 怎么看qq好友认识的时间有多久了(怎么看qq好友认识多少天)

    怎么看qq好友认识的时间有多久了(怎么看qq好友认识多少天)

  • 华为的芯片是谁生产的(华为的芯片是谁不让给了)

    华为的芯片是谁生产的(华为的芯片是谁不让给了)

  • airpods进水了能修吗(airpods进水了能保修吗)

    airpods进水了能修吗(airpods进水了能保修吗)

  • vivo手机锁屏广告如何关闭(vivo锁屏界面有广告怎么消除)

    vivo手机锁屏广告如何关闭(vivo锁屏界面有广告怎么消除)

  • 抖音怎样设置不让转发(抖音怎样设置不让别人看到我的关注)

    抖音怎样设置不让转发(抖音怎样设置不让别人看到我的关注)

  • 微信拉黑别人为什么可以收到信息(微信拉黑别人为什么还能看到头像)

    微信拉黑别人为什么可以收到信息(微信拉黑别人为什么还能看到头像)

  • r15和r17有什么区别(r15r17哪个好)

    r15和r17有什么区别(r15r17哪个好)

  • Vue组件中如何引入外部的js文件(vue 组件调用)

    Vue组件中如何引入外部的js文件(vue 组件调用)

  • 一般纳税人内账税金的处理
  • 个人所得税计提分录怎么写
  • 房产税城镇土地使用税申报期限
  • 资源税的征税对象都是原矿和选矿
  • 转入公账怎么做账
  • 股权变更后税务需要变更吗
  • 核定征收可以改查账征收吗
  • 工业企业销售成本如何计算
  • 工资薪金所得应纳税所得额
  • 年终奖如何合理发放
  • 转账支票和转账凭证
  • 委托在建工程会计分录
  • 车间管理人员的工资属于
  • 广告公司制作警示牌可以开具什么样的发票?
  • 外出拓展训练活动所花的费用怎么做分录?
  • 出口供货企业
  • 工业企业增值税缓交政策
  • 全年一次性奖金税收优惠政策
  • 净利润亏损怎么结转
  • 免抵税额增值税主表体现到哪里的
  • 个税申报密码是什么意思
  • 个体工商户的专票可以抵扣吗
  • 中国的农业成本为什么高
  • linux CentOS WEB服务器分区方案
  • 怎么利用腾讯手机号找人
  • 跨期发票怎么作废
  • 预收的购货款属于收入吗
  • win10回滚系统
  • php单例模式demo
  • 资本公积转增资本金
  • 未交增值税的核算方法
  • 个体户文化事业建设费免征
  • 零售价是含税价还是不含税价
  • 微信小程序计算器代码
  • vue中computed和watch
  • echo输出语句
  • lsmod命令结果详解
  • python闭包主要解决什么问题
  • 个体工商户属于灵活就业人员吗
  • 差旅费的进项税额需要转出吗
  • 在成本了核算工资怎么算
  • 公对公二手车交易税
  • 出租营改增之前取得的有形动产
  • 原值净值怎么算
  • 工资是当月计提当月发放还是当月计提下月发放
  • 暂存的凭证是怎么做的
  • 企业所得税会计利润
  • 税金及附加里面包含什么
  • 合并报表中的抵消分录是什么意思?
  • 预收款开发票,不确认收入可以吗?
  • 记账凭证错误的更正方法
  • 营业外支出核算的内容
  • 收到建筑发票会计分录
  • 工资表的重要性
  • 应付账款和预付账款都属于负债类科目
  • 事业单位可以报考事业单位吗
  • 如何修改sqlserver中sa用户的密码
  • MySQL 5.7.14 net start mysql 服务无法启动-“NET HELPMSG 3534” 的奇怪问题
  • windows8命令提示符命令大全
  • 安装win7系统后鼠标键盘不能用
  • adb.exe是什么程序
  • linux系统中对新磁盘分区的命令
  • uca1
  • psoft1.exe - psoft1是什么进程 有什么作用
  • windows7怎么卸载
  • linux系统ll
  • TestOpenGL
  • javascript有哪些常用的属性和方法
  • shell监控脚本例子大全
  • 批处理中数字可以用什么代替
  • nodejsorg
  • 手机屏幕适配
  • javascript编写
  • 正确的解决方式
  • email js
  • android 多页面
  • 脚本 python
  • 浙江省国家税务局总局官网
  • 重庆国税税务局官网
  • 发货确认收入还是以开票确认收入
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设