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

SpringBoot+vue实现WebSocket通信

WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务器主动向客户端推送数据。

WebSocket的主要特点:

  1. 全双工通信:客户端和服务器之间的数据可以同时双向传输
  2. 低延迟:由于是持久连接,所以不需要每次通信都重新建立连接,这大大减少了延迟。
  3. 节省带宽:WebSocket只需要一次握手,后续的数据传输都是基于这个连接,因此相对HTTP轮询来说更加节省带宽。

WebSocket的基本使用流程:

  1. 客户端发起请求:客户端发起一个WebSocket请求到服务器
  2. 握手阶段:服务器同意请求后,双方进入全双工模式。
  3. 数据传输:客户端和服务器客厅通过send()方法发送数据,通过onmessage事件处理接收到的数据。
  4. 关闭连接:当不再需要通信时,可以调用close()方法关闭连接。

 服务器(SpringBoot)示例代码

依赖引入

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

WebSocket配置类

@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpoint() {return new ServerEndpointExporter();}}

业务处理类

@Slf4j
@Component
@ServerEndpoint("/websocket/{username}")
public class WebSocketTest {private Session session;private String username;private static ConcurrentHashMap<String, WebSocketTest> webSocketSet = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(Session session, @PathParam("username") String username) {// 新的连接建立时执行,并且记录用户名this.session = session;this.username = username;webSocketSet.put(username, this);}@OnMessagepublic void onMessage(String message, Session session) {// 接收到前端消息时执行System.out.println("Received: " + message);try {session.getBasicRemote().sendText("Response from server: " + message);} catch (IOException e) {{e.printStackTrace();}}}@OnClosepublic void onClose (Session session, CloseReason closeReason){webSocketSet.remove(this.username);}@OnErrorpublic void onError (Session session, Throwable throwable){// 发生错误时执行System.out.println("Error ... " + session.getId());throwable.printStackTrace();}public void sendMessage2User(String message,String username) {try {webSocketSet.get(username).session.getBasicRemote().sendText(message);} catch (IOException e) {log.error("method=sendMessage2User||msg=send msg to user error", e);}}public void sendMessage() {String filePath = "C:/Users/heal/Desktop/1.txt"; // 替换为你的文件路径try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {String line;while ((line = br.readLine()) != null) {// username需要从客户端传入,我这里只是测试,所以写死sendMessage2User(line,"admin");}} catch (IOException e) {e.printStackTrace();}}

服务器记录每次连接的用户名,用于每次发送请求的session认证 

客户端(vue)调用代码示例

import Vue from 'vue'const WebSocketPlugin = {install(Vue, options) {const ws = new WebSocket('wss://127.0.0.1:8443/webserver/websocket')Vue.prototype.$websocket = {send(message) {if (ws.readyState === WebSocket.OPEN) {ws.send(message)}},onMessage(callback) {ws.onmessage = callback},onOpen(callback) {ws.onopen = callback},onClose(callback) {ws.onclose = callback},onError(callback) {ws.onerror = callback}}Vue.mixin({created() {if (this.$options.websocket) {this.$websocket.onMessage((message) => {// 处理接收到的消息console.log(message)})}}})}
}export default WebSocketPlugin

send() {this.$websocket.send('Hello, WebSocket!')},

也可以使用apifox直接发请求到服务器

这样就吧文件中的内容实时的返回给客户端了 


http://www.mrgr.cn/news/80690.html

相关文章:

  • libilibi项目总结(18)FFmpeg 的使用
  • 关于SpringBoot中AOP的深入理解
  • leetcode----mysql
  • uniapp使用百度地图配置了key,但是显示Map key not configured
  • 在JVM(Java虚拟机)中,PC寄存器(Program Counter Register)扮演着至关重要的角色。
  • vue3设置全局css变量
  • 论文学习—VAE
  • 【项目管理】GDB调试
  • 搭建分布式Kafka集群
  • Vue2二、指令补充,computed 计算属性vs方法,watch 侦听器,
  • 遇到“REMOTE HOST IDENTIFICATION HAS CHANGED!”(远程主机识别已更改)的警告
  • 知道一个服务器IP地址,如何attack对方美国
  • 从0开始写android 之xwindow
  • MYSQL 利用concat函数 生成更新或者插入SQL
  • HUAWEI-eNSP交换机链路聚合(手动负载分担模式)
  • go 自己写序列化函数不转义
  • linux安装mysql
  • 二、使用langchain搭建RAG:金融问答机器人--数据清洗和切片
  • Python 在Word文档中插入图片的3种方式(插入到段落、插入到指定位置、插入到每一页)
  • spring\strust\springboot\isp前后端那些事儿
  • 三、使用langchain搭建RAG:金融问答机器人--检索增强生成
  • iClient3D for Cesium 实现限高分析
  • 【Nginx-4】Nginx负载均衡策略详解
  • 阮一峰C语言教程_10字符串
  • 最新ubuntu20.04安装docker流畅教程
  • 数据结构十大排序之(冒泡,快排,并归)