springboot使用webscoket

springboot添加config配置项

package cn.lsy.api.yuy.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;@Configuration
public class WebSocketConfig {// 配置文件@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}}

springboot websocket主类

package cn.lsy.api.yuy.controller;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;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.alibaba.fastjson.JSON;import cn.lsy.api.yuy.entity.Message;@Component
@ServerEndpoint("/chat/{id}")
public class Websocket {private static final Map<String, Session> onLineList = new HashMap<>();@OnOpenpublic void OnOpen(Session session, @PathParam("id") String id) {// 用户上线onLineList.put(id, session);// 群发所有人有人上线更新上线列表onLineList.forEach((key, value) -> {try {value.getBasicRemote().sendText(JSON.toJSONString(getOnLine()));} catch (IOException e) {}});}@OnMessagepublic void onmessage(Session session, String message, @PathParam("id") String id) {Message message2 = JSON.parseObject(message,Message.class);// 群发所有人onLineList.forEach((key, value) -> {try {value.getBasicRemote().sendText(message2.getContent());} catch (IOException e) {System.out.println(e);}});}public Message getOnLine(){ArrayList<String> arrayList = new ArrayList<>();Message message = new Message();onLineList.forEach((key, value) -> {arrayList.add(key);});message.setOnLinSet(arrayList);message.setType("3");return message;}@OnClosepublic void onclose(Session session, @PathParam("id") String id) {onLineList.remove(id);// 群发所有人有人下线更新在线列表onLineList.forEach((key, value) -> {try {value.getBasicRemote().sendText(JSON.toJSONString(getOnLine()));} catch (IOException e) {// TODO: handle exception}});}}

springboot消息实体类

package cn.lsy.api.yuy.entity;import java.util.List;import lombok.Data;@Data
public class Message {public String type;public String content;public Integer fromId;public Integer toId;public List onLinSet;}

vue

<template><div><div><label for="user">用户名:</label>  <input name="user" type="text"  v-model="name"><button @click="createWebSocket">加入</button></div><div><label>消息内容:</label><textarea v-model="content"></textarea><button @click="sendMessage">发送</button></div><div>当前在线列表<div v-for="(item,index) in onLineInfo" :key="index">{{ item }}</div><input type="radio"></div><div class="messageBox"><div class="q">群聊<div>123</div></div><div class="d">单聊<div>123</div></div></div></div>
</template><script setup>
import { onMounted,ref,reactive} from 'vue';
const name = ref(null);
const content = ref(null);
const toId = ref(null)
const onLineInfo = ref(null)
let ws;// 建立连接
function createWebSocket(){if(name.value!="" && name.value!=null){ws = new WebSocket(`ws://localhost:8080/chat/${name.value}`)ws.onmessage = messagews.onopen = open}else{alert("用户名不能为空")}}
function onMessage(e){console.log(e)
}
function message(e){console.log("message",JSON.parse(e.data))const message = JSON.parse(e.data)if(message.type === "3"){onLineInfo.value = message.onLinSet}
}
function open(e){console.log("open",e)
}
const sendMessage = ()=>{let message = {type:1,fromId:name.value,content:content.value,toId:toId.value}ws.send(JSON.stringify(message))
}</script><style>
.messageBox{display: flex;
}
.q,.d{width: 200px;text-align: center;
}
</style>

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

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

相关文章

CMS与AI的融合:构建万能表单小程序系统

引言&#xff1a; 随着人工智能技术的飞速发展&#xff0c;MyCMS作为一款功能强大的内容管理系统&#xff0c;通过集成AI技术&#xff0c;进一步拓展了其应用范围和智能化水平。本文将探讨如何利用MyCMS结合AI技术&#xff0c;构建一个能够将用户提交的万能表单数据转化为智能提…

helm命令如何修改values.yaml里面的变量值

在使用 Helm 安装 chart 的时候&#xff0c;你有几种方法可以在安装时修改 values.yaml 中的值&#xff0c;以便自定义安装。这些方法让你无需直接编辑 chart 包中原始的 values.yaml 文件&#xff1a; 1. 使用 --values 或 -f 参数指定自定义 values 文件 你可以创建一个自定…

【Ardiuno】实验使用ESP32单片机根据光线变化控制LED小灯开关(图文)

今天小飞鱼继续来实验ESP32的开发&#xff0c;这里使用关敏电阻来配合ESP32做一个我们平常接触比较多的根据光线变化开关灯的实验。当白天时有太阳光&#xff0c;则把小灯关闭&#xff1b;当光线不好或者黑天时&#xff0c;自动打开小灯。 int value;void setup() {pinMode(34…

前端老古董execCommand——操作 选中文本 样式

文章目录 ⭐前言⭐exe command api用法&#x1f496; example示例&#x1f496; 测试效果 ⭐execommand和getSelection 的联系⭐总结⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端老古董execCommand——操作选中文本。 execommand 当一个 HTML 文…

基于CentOS Stream 9平台安装Redis7.0.15

1. 官方下载地址 https://redis.io/downloads/#redis-downloads 1.1 下载或上传到/opt/coisini目录下&#xff1a; mkdir /opt/coisini cd /opt/coisini wget https://download.redis.io/releases/redis-7.0.15.tar.gz2. 解压 tar -zxvf redis-7.0.15.tar.gz 3. 创建软连接 或…

算法:分治(快排)题目练习

目录 题目一&#xff1a;颜色分类 题目二&#xff1a;排序数组 题目三&#xff1a;数组中的第k个最大元素 题目四&#xff1a;库存管理III 题目一&#xff1a;颜色分类 给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums &#xff0c;原地对它们进行排序&#xff0c;…

【回文 马拉车】214. 最短回文串

本文涉及知识点 回文 马拉车 LeetCode214. 最短回文串 给定一个字符串 s&#xff0c;你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 1&#xff1a; 输入&#xff1a;s “aacecaaa” 输出&#xff1a;“aaacecaaa” 示…

【单元测试】Spring Boot 的测试库

Spring Boot 的测试库 1.了解回归测试框架 JUnit2.了解 assertThat3.了解 Mockito4.了解 JSONPath5.测试的回滚 单元测试&#xff08;unit test&#xff09;是为了检验程序的正确性。一个单元可能是单个 程序、类、对象、方法 等&#xff0c;它是应用程序的最小可测试部件。 单…

[大模型]XVERSE-7B-chat Transformers 推理

XVERSE-7B-Chat为XVERSE-7B模型对齐后的版本。 XVERSE-7B 是由深圳元象科技自主研发的支持多语言的大语言模型&#xff08;Large Language Model&#xff09;&#xff0c;参数规模为 70 亿&#xff0c;主要特点如下&#xff1a; 模型结构&#xff1a;XVERSE-7B 使用主流 Deco…

用于每个平台的最佳WordPress LMS主题

你已选择在 WordPress 上构建学习管理系统 (LMS)了。恭喜&#xff01; 你甚至可能已经选择了要使用的 LMS 插件&#xff0c;这已经是成功的一半了。 现在是时候弄清楚哪个 WordPress LMS 主题要与你的插件配对。 我将解释 LMS 主题和插件之间的区别&#xff0c;以便你了解要…

如何打开pak文件-翻译pak语言包

最近碰到一些程序的语言包是pak格式&#xff0c;用Notepad打开全是乱码&#xff0c;百度搜索了一下&#xff0c;pak是一种少见的压缩文件格式&#xff0c;是pak Quake系列游戏所采用的一种特殊压缩包格式&#xff0c;由Quake游戏公司开发&#xff0c;用高版本的winrar可以打开&…

DP动态规划(下)

文章目录 如何在动态规划中有效地使用std::unordered_map?以下是使用std::unordered_map进行动态规划的一些关键点&#xff1a;选择合适的键&#xff1a;考虑哈希冲突&#xff1a;优化哈希函数&#xff1a; 下面是一个使用std::unordered_map解决斐波那契数列问题的例子&#…

测试 halcon算子 derivate_gauss 高斯一阶导数卷积

参上了 matlab fileexchange 有人上传了高斯 dx,dy一阶导卷积代码 卷积核的计算我修改成了核元素绝对值求做分母 归一化 和halcon的 derivate_gauss算子的计算结果对别如下 还是不知道怎么做到两者结果一致. 测试图像: 我的: halcon的: 获取两份图像的灰度值到数组并做对应位…

即时聊天系统

功能描述 该项目是一个前后端分离的即时聊天项目&#xff0c;前端采用vue2、后端使用springboot以mysql8.0作为数据库。 项目功能包含了单聊、群聊功能。在此基础上增加了对好友的功能操作&#xff0c;如备注设为通知、视频聊天、语音聊天、置顶、拉入黑名单、清空聊天记录等。…

【面试干货】Integer 和 int 的区别

【面试干货】Integer 和 int 的区别 1、基本类型与包装类型2、内存占用3、自动装箱与拆箱4、null 值5、常量池6、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在Java中&#xff0c;Integer 和 int 是两种不同类型的变量&#xff0c;…

leetcode LRU 缓存

leetcode: LRU 缓存 LRU 全称为 Least Recently Used&#xff0c;最近最少使用&#xff0c;常常用于缓存机制&#xff0c;比如 cpu 的 cache 缓存&#xff0c;使用了 LRU 算法。LRU 用于缓存机制时&#xff0c;关键的是当缓存满的时候有新数据需要加载到缓存的&#xff0c;这个…

自动化测试断言

自动化判断测试用例的执行的结果是否成功&#xff0c;是通过判断测试得到的实际结果与预期结果是否相等决定的。这个时候就用到了断言。 检查点分为两个&#xff0c;一个是页面级别的检查&#xff0c;包括网页的标题和网址&#xff0c;以及是否包含某个文字 另一个检查点是页…

CSS从入门到精通——动画:CSS3动画延迟和完成后状态的保持

目录 任务描述 相关知识 动画状态 动画完成时的状态 动画延迟 编程要求 任务描述 本关任务&#xff1a;用 CSS3 实现小车等待红绿灯的效果。效果图如下&#xff1a; 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.动画状态&#xff0c;2.动画完成时的状…

复旦大学辅修金融学专业

本文记录一下笔者本科时期在复旦大学辅修金融学专业所上过的课程。先是列出所有的课程名称&#xff0c;然后在GPT-4o的作用下生成每门课的主要研究内容。 主修课程&#xff1a; 第一学期&#xff1a;微观经济学&#xff0c;金融市场学&#xff0c;会计学 第二学期&#xff1a;…

[Cloud Networking] SPDY 协议

文章目录 1. 背景2. SPDY 之前3. SPDY 项目目标4. SPDY 功能特点4.1 SPDY基本功能4.2 SPDY高级功能 1. 背景 TCP是通用的、可靠的传输协议&#xff0c;提供保证交付、重复抑制、按顺序交付、流量控制、拥塞避免和其他传输特性。 HTTP是提供基本请求/响应语义的应用层协议。 不…