2023/12/10总结

学习

WebSocket

一共四种方法,传递数据是要通过JSON格式传递

前端

  • onopen

在连接时

  • onmessage

收到消息时 通常携带参数 event  ,event.data 是消息

  • onerror

发生错误时

  • onclose

关闭连接时

  • 发送消息

需要安装 vue-native-websocket

pnpm i vue-native-websocket

然后为了全局使用,我是放在了 pinia 状态管理工具里面,来实现

import {defineStore} from "pinia";
import {h, ref} from 'vue'
import {useUserStore} from "@/stores/userStore";
import {ElMessage, ElNotification} from "element-plus";
import {messageTitle} from "@/utils/MessageTitle";export const useWsStore=defineStore("ws",()=>{let ws=nullconst userStore=useUserStore()const message=ref({})const wsInit=()=>{if (ws && ws.readyState === WebSocket.OPEN) {console.log('WebSocket 连接已经存在');return false}if(typeof(WebSocket) === "undefined"){alert("您的浏览器不支持socket")return false}const open1 = (msg) => {ElNotification({title: '消息',message: h('i', { style: 'color: teal' }, msg),})}ws=new WebSocket("ws://localhost:8081/api/websocket"+'/'+userStore.user.id)console.log("ws连接已经建立")ws.onmessage=(event)=>{console.log("收到了消息"+event.data)const {messageType,receiverId,t}={...JSON.parse(event.data)}if(receiverId!==userStore.user.id){return}message.value=JSON.parse(event.data)open1(messageTitle[messageType])}ws.onerror=()=>{ElMessage.error("网络连接出错")}ws.onclose=()=>{ElMessage.error("连接已经关闭")}}const sendMessage=(type,receiverId,data)=>{if(ws&&ws.readyState===WebSocket.OPEN){ws.send(JSON.stringify({messageType:type,receiverId,t:data}))}else{ElMessage.error("当前连接已经断开,请重试")}}return {ws,message,wsInit,sendMessage}
})

然后只需要在组件挂载的时候初始化,并且监听 watch message的变化去做出界面的改变就行。

后端

  • 依赖
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>2.0.7</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
  • 配置类
@Configuration
@EnableWebSocket
public class WebSocketConfig {/*** 	注入ServerEndpointExporter,* 	这个bean会自动注册使用了@ServerEndpoint注解声明的Websocket endpoint*/@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}
  • websocket类

启动类需要加注解 @EnableWebSocket

  • onopen

  • onmessage

  • onerror

  • onclose

然后就是需要注意的一个地方,spring管理的都是单例(singleton),和 websocket (多对象)相冲突。 详细解释:项目启动时初始化,会初始化 websocket (非用户连接的),spring 同时会为其注入 service,该对象的 service 不是 null,被成功注入。但是,由于 spring 默认管理的是单例,所以只会注入一次 service。当新用户进入聊天时,系统又会创建一个新的 websocket 对象.

解决方法:

  • 启动类:
@EnableTransactionManagement
@ServletComponentScan
@SpringBootApplication
@EnableWebSocket
public class ElmApplication {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication(ElmApplication.class);ConfigurableApplicationContext configurableApplicationContext = springApplication.run(args);//        SpringApplication.run(ElmApplication.class, args);WebSocket.setApplicationContext(configurableApplicationContext);}}
  • socket对象

  • 使用

项目完成:

聊天

界面:

评论:

评论还有一部分没写完,是因为要在订单的处理上要实现消息推送,就还没写完。但是可以发布了,数据库能够写入数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/264563.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

stu06-VSCode里的常用快捷键

Alt Z&#xff1a;文字自动换行。当一行的文字太长时&#xff0c;可以使用。或者查看→自动换行Alt Shift ↓ &#xff1a;快速复制当前行到下一行Alt Shift ↑ &#xff1a;快速复制当前行到上一行Alt B&#xff1a;在默认浏览器中打开当前.html文件Ctrl Enter&#xf…

【Unity动画】什么是任意状态(Any state)

&#xff08;Any state&#xff09;可以从某个状态A直接切换到另一个状态 B\C\D\E\F 比如A到C的过渡&#xff0c;直接设置从Any state 到C的过渡线触发参数即可。而不需要让A到C直接在连接&#xff0c;同样&#xff0c;B到C之间也无需直接链接。 这样设计是在每一个动画之间都…

Jmeter 请求签名api接口-BeanShell

Jmeter 请求签名api接口-BeanShell 项目签名说明编译扩展jar包jmeter 使用 BeanShell 调用jar包中的签名方法 项目签名说明 有签名算法的api接口本地不好测试&#xff0c;使用BeanShell 扩展jar 包对参数进行签名&#xff0c;接口签名算法使用 sha512Hex 算法。签名的说明如下…

6.4 U-boot 移植

一、ST 官方 U-boot 编译测试 1. ST 官方 uboot 源码打补丁 1.1 获得 ST 官方的 uboot 源码 https://www.cnblogs.com/toutiegongzhu/p/17578847.html 这里可以看如何下载uboot源码。解压完后输入以下命令&#xff1a; cd stm32mp1-openstlinux-5.4-dunfell-mp1-20-06-24/s…

2024年顶级的9个 Android 数据恢复工具(免费和付费)

不同的事情可能会损坏您的Android手机并导致您丢失数据。但大多数时候&#xff0c;您可以使用取证工具恢复部分或全部文件。 问题可能来自手机的物理损坏、磁盘的逻辑故障、完整的系统擦除&#xff0c;或者只是简单的粗心大意。 但是&#xff0c;无论数据丢失的原因是什么&am…

智能优化算法应用:基于多元宇宙算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于多元宇宙算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于多元宇宙算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.多元宇宙算法4.实验参数设定5.算法结果6.…

AS安装目录

编辑器&#xff1a; sdk: gradle: gradle使用的jdk目录&#xff1a;Gradle使用的jdk是android studio安装目录下的jbr 成功项目的android studio配置&#xff1a;

机器学习算法(9)——集成技术(Bagging——随机森林分类器和回归)

一、说明 在这篇文章&#xff0c;我将向您解释集成技术和著名的集成技术之一&#xff0c;它属于装袋技术&#xff0c;称为随机森林分类器和回归。 集成技术是机器学习技术&#xff0c;它结合多个基本模块和模型来创建最佳预测模型。为了更好地理解这个定义&#xff0c;我们需要…

大厂算法指南:优选算法 ——双指针篇(下)

大厂算法指南&#xff1a;优选算法 ——双指针篇&#xff08;上&#xff09; 前言&#xff1a;双指针简介一、[611. 有效三角形的个数](https://leetcode.cn/problems/valid-triangle-number/)1.1 算法思路&#xff08;排序 双指针&#xff09;1.2 代码实现 二、[LCR 179. 查找…

win11+RTX 4070Ti+CUDA12.1+cuDNN12.x+pytorch2.1 环境配置(图文教程)

win11RTX 4070TiCUDA12.1cuDNN12.xpytorch2.1 环境配置&#xff08;图文教程&#xff09; 教程基本信息介绍卸载已安装的CUDA和cuDNN安装CUDA与cuDNN安装 Anaconda安装 pytorch测试 pytorch 是否安装成功 教程基本信息介绍 此教程为本人安装记录&#xff0c;仅供参考 本教程时间…

【机器学习】041_模型开发迭代过程

一、模型开发的一般步骤 1. 明确研究问题 确定问题的组成和结果&#xff0c;明晰问题是分类问题还是回归问题 2. 决定系统总体架构 ①理解数据&#xff1a;采集&#xff08;爬取&#xff09;数据&#xff0c;生成&#xff08;导入&#xff09;数据&#xff0c;进行数据清洗…

【数据结构高阶】红黑树

目录 一、红黑树的概念 二、红黑树的性质 2.1 红黑树与AVL树的比较 三、红黑树的实现 3.1 红黑树节点的定义 3.2 数据的插入 3.2.1 红黑树的调整思路 3.2.1.1 cur为红&#xff0c;f为红&#xff0c;g为黑&#xff0c;u存在且为红 3.2.1.2 cur为红&#xff0c;f为红&am…