当前位置: 首页 > news >正文

SpringBoot + Vue实现websocket

后端代码

pom.xml增加依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

增加ServerEndpointExporter Bean

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;/*** @Author zhangyugu* @Date 2022/3/28 5:00 下午* @Version 1.0*/
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

增加websocket事件的监听器和发送消息工具类 WebSocketHandler,增加该类后SpringBoot服务接收到形如 /ws/xxx 的url请求将进入如下代码逻辑。

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;import org.springframework.stereotype.Component;import com.baomidou.mybatisplus.core.toolkit.StringUtils;import lombok.extern.slf4j.Slf4j;@Slf4j
@ServerEndpoint(value = "/ws/{token}")
@Component
public class WebSocketHandler {static Map<String, Session> sessions = new HashMap<>();/*** 打开连接* @param session* @param token 当前登录用户的token,用于标识该连接的用户*/@OnOpenpublic void open(Session session, @PathParam("token") String token) {if(StringUtils.isBlank(token)) {return;}sessions.put(token, session);}/*** 关闭连接* @param session*/@OnClosepublic void close(Session session) {Iterator<Map.Entry<String, Session>> itr = sessions.entrySet().iterator();while(itr.hasNext()) {Map.Entry<String, Session> entry = itr.next();if(entry.getValue().equals(session)) {itr.remove();}}}/*** 收到消息* @param session* @param msg*/@OnMessagepublic void onMessage(Session session, String msg) {log.debug("getMsg from {}:{}", session.getId(), msg);}/*** 发送消息的方法* @param token* @param msg* @throws IOException*/public static void sendMsg(String token, String msg) throws IOException {Session session = sessions.get(token);if(session!=null) {session.getBasicRemote().sendText(msg);}}
}

前端代码

<template><div><input type="text" v-model="inputMessage"><button @click="sendMessage">发送</button><div>接收到消息:<br>{{receivedMsg}}</div></div>
</template>
<script>
export default {data() {return {socket: null,receivedMsg: '',inputMessage: ''};},mounted() {// Create a new WebSocket connectionlet baseUrl = "localhost:2222";let token = "xx";//登录得到的tokenthis.socket = new WebSocket(`ws://${baseUrl}/ws/${token}`);// Set up event listenersthis.socket.onopen = (event) => {console.log('WebSocket connection opened.');};this.socket.onmessage = (event) => {this.receivedMsg += event.data;};this.socket.onerror = (error) => {console.error('WebSocket Error:', error);};this.socket.onclose = (event) => {console.log('WebSocket connection closed.');};// 定时检查连接是否正常,不正常则重连this.timer = setInterval(() => {if (this.socket) {if (this.socket.readyState == 1) {try {this.socket.send('heartbeat');console.log('heartbeat');} catch (err){console.log('断线:' + err);this.connect();}} else if(this.socket.readyState == 3) {console.log('reconnect');this.connect();}}}, 10000);},methods: {connect() {// Create a new WebSocket connectionlet baseUrl = "localhost:2222";let token = "xx";//登录得到的tokenthis.socket = new WebSocket(`ws://${baseUrl}/ws/${token}`);},sendMessage() {if (this.socket && this.inputMessage) {this.socket.send(this.inputMessage);this.inputMessage = ''; // Clear the input field after sending}}},beforeDestroy() {// Close the WebSocket connection when the component is destroyedif (this.socket) {this.socket.close();}if (this.timer) {clearInterval(this.timer);}}
};
</script>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Javascript归纳与总结——this指向及其改变、new关键字与原型链、异步、闭包和函数防抖与节流
  • Python 全栈系列265 使用ORM、Kafka、Apscheduler实现任务的并发处理
  • 基于django的失物招领系统的设计与实现/ 基于Python的失物招领系统的设计与实现/失物招领管理系统
  • Linux随记(十一)
  • Android13系统源码内置App并通过AIDL调用获取内置存储卡的真实大小
  • EmbeddedGUI简介
  • 语音控制开关的语音识别ic芯片方案
  • Linux信号处理机制基础
  • 创新之光闪耀,点赋科技在第十三届创新创业大赛中绽放光彩
  • BaseCTF Week2
  • linux固定ip
  • Tampermonkey 安装
  • Python的8个构建桌面应用的技巧
  • CNN网络的一些基本知识
  • 代码随想录算法训练营day58:图论08:拓扑排序精讲;dijkstra(朴素版)精讲
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 4个实用的微服务测试策略
  • css布局,左右固定中间自适应实现
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • javascript数组去重/查找/插入/删除
  • JS实现简单的MVC模式开发小游戏
  • REST架构的思考
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Windows Containers 大冒险: 容器网络
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 京东美团研发面经
  • 开发基于以太坊智能合约的DApp
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 那些年我们用过的显示性能指标
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 区块链共识机制优缺点对比都是什么
  • 如何设计一个微型分布式架构?
  • 实现菜单下拉伸展折叠效果demo
  • Android开发者必备:推荐一款助力开发的开源APP
  • ionic异常记录
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • %check_box% in rails :coditions={:has_many , :through}
  • (13)DroneCAN 适配器节点(一)
  • (2)空速传感器
  • (function(){})()的分步解析
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (汇总)os模块以及shutil模块对文件的操作
  • (实战篇)如何缓存数据
  • (译)计算距离、方位和更多经纬度之间的点
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • ****三次握手和四次挥手