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

  • 华为p40是否是5g全网通手机(华为p40是不是都是5g手机)

    华为p40是否是5g全网通手机(华为p40是不是都是5g手机)

  • 光标一直在跳动(光标一直在跳动怎么关闭)

    光标一直在跳动(光标一直在跳动怎么关闭)

  • 小米10pro光学变焦多少倍(小米10s光学)

    小米10pro光学变焦多少倍(小米10s光学)

  • 微信以前的图片怎么恢复(微信以前的图片过期了怎么办)

    微信以前的图片怎么恢复(微信以前的图片过期了怎么办)

  • 红米k30黑屏(红米k30黑屏开不了机)

    红米k30黑屏(红米k30黑屏开不了机)

  • qq单删对方还有你吗(qq单删后对方还有联系人的吗)

    qq单删对方还有你吗(qq单删后对方还有联系人的吗)

  • 微信申诉显示无须申诉(微信账号申诉显示无需申诉)

    微信申诉显示无须申诉(微信账号申诉显示无需申诉)

  • 苹果手机下载歌曲存储在哪里(苹果手机下载歌曲怎么设置铃声)

    苹果手机下载歌曲存储在哪里(苹果手机下载歌曲怎么设置铃声)

  • 注销的淘宝号还能找回吗(注销的淘宝号还在怎么回事)

    注销的淘宝号还能找回吗(注销的淘宝号还在怎么回事)

  • 扩列限时匹配不见了(扩列匹配不到人怎么办)

    扩列限时匹配不见了(扩列匹配不到人怎么办)

  • 华为手机怎么改返回键位置(华为手机怎么改按键模式)

    华为手机怎么改返回键位置(华为手机怎么改按键模式)

  • 天猫精灵不插电可以用吗(天猫精灵不插电能用吗)

    天猫精灵不插电可以用吗(天猫精灵不插电能用吗)

  • 用电脑申请qq号怎么申请(电脑qq号申请注册步骤)

    用电脑申请qq号怎么申请(电脑qq号申请注册步骤)

  • 华为nova5pro尺寸(华为nova5pro尺寸英寸)

    华为nova5pro尺寸(华为nova5pro尺寸英寸)

  • 喜马拉雅获取声音资源出错怎么回事(喜马拉雅怎么听音识曲)

    喜马拉雅获取声音资源出错怎么回事(喜马拉雅怎么听音识曲)

  • 华为充电器接口叫什么(华为充电器接口图片)

    华为充电器接口叫什么(华为充电器接口图片)

  • 企业微信怎么更改公司(企业微信怎么更换企业)

    企业微信怎么更改公司(企业微信怎么更换企业)

  • realme Q充满电要多久(realmeq3充满电要多久)

    realme Q充满电要多久(realmeq3充满电要多久)

  • 华为nova5自带保护膜吗(华为nova5保修期)

    华为nova5自带保护膜吗(华为nova5保修期)

  • 抖音怎么调全屏(华为matepad11抖音怎么调全屏)

    抖音怎么调全屏(华为matepad11抖音怎么调全屏)

  • 红米note8pro有屏幕指纹吗(红米note8pro有屏幕支架吗)

    红米note8pro有屏幕指纹吗(红米note8pro有屏幕支架吗)

  • iphone8p无线充电设置(iPhone8p无线充电功率)

    iphone8p无线充电设置(iPhone8p无线充电功率)

  • jlpt1是什么接口(jlpc是什么接口)

    jlpt1是什么接口(jlpc是什么接口)

  • 电脑右下角弹出广告的解决方法是什么?(电脑右下角弹出网页没有×怎么关闭)

    电脑右下角弹出广告的解决方法是什么?(电脑右下角弹出网页没有×怎么关闭)

  • unarj命令  解压.arj文件(unrar解压命令)

    unarj命令 解压.arj文件(unrar解压命令)

  • 外部奖励与内部奖励
  • 无票收入小规模怎么报增值税
  • 付钱给对方会计分录
  • 贷款公司股权转让合法吗
  • 个体工商户生产经营所得税税率表2021
  • 洒水车计提折旧会计分录
  • 样品费用会计分录
  • 行政单位现金日记账填写样本
  • 员工垫付公司费用法规
  • 贴标企业
  • 建筑公司对外如何开票
  • 服务业发票税率是多少
  • 足疗发票税点
  • 税控盘减免怎么做账
  • 房产税税计入什么科目
  • 分拆业务所涉及客户
  • 工会筹备金和工会经费金额一样吗
  • 小规模纳税人购车好处
  • 出口的会计分录
  • 小型微利企业普惠性减税政策
  • 企业收取的会员费当无法继续提供服务能退吗?
  • 出口退税怎么申报个税
  • 如何用腾讯电脑管家删除文件
  • 苹果官网入口
  • 汽车维修行业会计分录
  • 外贸企业代理出口销售的出口退税手续由谁办理
  • 深度学习&故障诊断初学者 - 学习路线
  • wordpress使用
  • laravel中的session有效期
  • 房地产消防工程入什么科目
  • 职工福利费入账依据
  • named-config
  • logparser命令
  • 软件折旧费
  • 增值税报销是什么意思
  • 材料发票和工程发票的区别
  • java基础介绍
  • 织梦停止更新了吗
  • 帝国cms使用手册
  • 代收代付进项税转出吗
  • 基于法律行为的物权变动模式包括
  • 营改增之后发票的变化
  • sqlserver2000分页
  • 股东的投资款怎么收回
  • 在工资模块中进行各工资类别间的汇总
  • 外资企业和内资企业并举
  • 流转税怎么核算
  • 事业单位购入
  • 应付账款从质保金扣除
  • 什么是调表不调账
  • 有留抵税额可以红冲吗
  • 小企业会计准则2023电子版
  • 固定资产折旧如何计提
  • 金税盘税费减免分录
  • 什么是企业管理的基础工作
  • 教育类退费
  • 机票改签手续费有报销凭证吗
  • 会计报表分析的方法
  • sap批量导入
  • win7系统命令激活
  • freebsd常用命令
  • wp7.8升级wp8
  • 桌面任务栏消失怎么办
  • linux swap和mem
  • win7 64位系统使用360安全浏览器在网页中播放视频出现花屏的解决方法
  • win10预览体验计划不显示
  • win7旗舰版系统激活密钥
  • dos命令/s
  • 用python进行翻译
  • python读取grib
  • 深入解读我本是高山
  • js滚动条滚动触发事件
  • 电子税务局查询一般纳税人资格
  • 营改增之前建筑业税率是多少
  • 国家税务总局广州市税务局
  • 广东省电子税务局网上办税大厅
  • 在水贝买的黄金
  • 税控盘换新会影响旧盘数据吗
  • 北京的个人所得税怎么算
  • 文件印发的格式怎么设置
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设