基于spingboot的websocket订阅、广播、多人聊天室示例
概述
基于spingboot的websocket多人聊天系统。包括订阅,广播、点对点单人聊天,多人聊天室功能。
详细
一、运行效果
简单示例

广播

单人聊天

多人聊天室

二、相关代码
websocket配置
package com.iamgpj.demowebsocket.config;import com.iamgpj.demowebsocket.v4.SocketChannelInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;import javax.websocket.server.ServerEndpointConfig;/*** @author Ives* @date 2020/4/20 13:51*/
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends ServerEndpointConfig.Configurator implements WebSocketMessageBrokerConfigurer {/*** 注册端点,发布或者订阅消息的时候需要连接此端点* addEndpoint websocket的端点,客户端需要注册这个端点进行链接* setAllowedOrigins 非必须,*表示允许其他域进行连接,跨域* withSockJS 允许客户端利用sockjs进行浏览器兼容性处理* @param registry*/@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/ws/endpoints-websocket")//.setAllowedOrigins("*").withSockJS();}/*** 配置消息代理* @param registry*/@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {// 设置服务器广播消息的基础路径registry.enableSimpleBroker("/topic", "/user");// 设置客户端订阅消息的基础路径registry.setApplicationDestinationPrefixes("/app");}/** 配置频道拦截器,用于聊天室 */@Overridepublic void configureClientInboundChannel(ChannelRegistration registration) {registration.interceptors(new SocketChannelInterceptor());}
}
聊天室程序
package com.iamgpj.demowebsocket.v4;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;/*** @author Ives* @date 2020/4/21 11:13*/
@Service
@Slf4j
public class ChatRoomService {@Autowiredprivate SimpMessagingTemplate template;/*** 模拟数据库中存储的用户*/public static Map<String, String> userMap = new HashMap<>();/*** 保存当前在线用户* 实际应该存储于redis等可持久化缓存服务器中,做到数据共享*/public static Map<String, String> onlineUserMap = new HashMap<>();/** 初始化数据 */static {userMap.put("张三", "111111");userMap.put("李四", "111111");userMap.put("王五", "111111");userMap.put("赵六", "111111");userMap.put("陈七", "111111");}/*** 每两秒给客户端推送当前在线用户*/@Scheduled(fixedRate = 2000)public void pushOnlineUser() {Collection<String> users = onlineUserMap.values();log.info("【聊天室在线用户】={}", users);template.convertAndSend("/topic/onlineUser", users);}/*** 推送聊天消息* @param inMessage 内容*/public void pushChatRoom(InMessage inMessage) {OutMessage outMessage = new OutMessage();BeanUtils.copyProperties(inMessage, outMessage);outMessage.setPushTime(LocalDateTime.now());template.convertAndSend("/topic/chatRoom", outMessage);}
}
三、代码结构

四、相关说明
1、项目前段使用bootstrap框架,使用maven引入webjars作为样式文件。
2、访问路径分别为
http://localhost:8080/v1/index.html
http://localhost:8080/v2/index.html
http://localhost:8080/v3/tom.html
http://localhost:8080/v3/jerry.html
http://localhost:8080/v4/index.html
3、聊天室请分别使用不同浏览器登录测试。登录名可以为,张三、李四、王五、赵六....
相关文章:
基于spingboot的websocket订阅、广播、多人聊天室示例
概述 基于spingboot的websocket多人聊天系统。包括订阅,广播、点对点单人聊天,多人聊天室功能。 详细 一、运行效果 简单示例 广播 单人聊天 多人聊天室 二、相关代码 websocket配置 package com.iamgpj.demowebsocket.config;import com.iamgpj.d…...
Linux mac Windows三系统 局域网文件共享方法
主要工具: Samba是一个开源的软件套件,允许Linux系统与Windows系统之间共享文件和打印机。 一、首先是Linux共享的设置 ①安装 sudo apt-get install samba ②创建共享文件夹 sudo mkdir /home/share ③配置用户 sudo smbpasswd -a kequan ④修改…...
Java——比较器
引入的背景 我们知道基本数据类型的数据(除boolean类型外)需要比较大小的话,直接使用比较运算符即可,但是引用数据类型是不能直接使用比较运算符来比较大小的。那么,如何解决这个问题呢? 在Java中经常会涉…...
【数据结构】初识泛型
文章目录 一般的类和方法,只能使用具体的类型: 要么是基本类型,要么是自定义的类。这种限制对代码的束缚就会很大。所以我们引入了泛型。泛型,泛顾名思义就是广泛的意思。就是适用于许多许多类型。从代码上讲,就是对类型实现了参数…...
代码随想录--哈希--有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2: 输入: s "rat", t "car" 输出: false 说明: 你可以假设字符串只包含小写字母。…...
MySQL——数据的增删改
2023.9.12 本章开始学习DML (数据操纵语言) 语言。相关学习笔记如下: #DML语言 /* 数据操作语言: 插入:insert 修改:update 删除:delete */#一、插入语句 #方式一:经典的插入 /* 语法: insert …...
云服务器与http服务器
如何与http服务器建立连接(客户端)? http请求设计格式: 例子: 发送http请求 http数据响应格式: 接收http服务器返回的数据需要进一步进行字符串处理操作,提取有用的数据。...
golang教程 beego框架笔记一
安装beego 安装bee工具 beego文档 # windos 推荐使用 go install github.com/beego/bee/v2master go get -u github.com/beego/bee/v2masterwindows使用安装bee工具时碰到的问题; 环境配置都没有问题,但是执行官网的命令:go get -u github…...
【深度学习】Mini-Batch梯度下降法
Mini-Batch梯度下降法 在开始Mini-Batch算法开始之前,请确保你已经掌握梯度下降的最优化算法。 在训练神经网络时,使用向量化是加速训练速度的一个重要手段,它可以避免使用显式的for循环,并且调用经过大量优化的矩阵计算函数库。…...
AI项目六:WEB端部署YOLOv5
若该文为原创文章,转载请注明原文出处。 一、介绍 最近接触网页大屏,所以就想把YOLOV5部署到WEB端,通过了解,知道了两个方法: 1、基于Flask部署YOLOv5目标检测模型。 2、基于Streamlit部署YOLOv5目标检测。 代码在…...
敲代码常用快捷键
1、代码拖动 PyCharm:按住 shiftalt鼠标选中某一区域来拖动,即可实现拖动这一区域至指定区域。Visual Studio Code (VSCode): - Windows/Linux:Alt 鼠标左键拖动 - MacOS:Option 鼠标左键拖动 IntelliJ IDEA: - Win…...
MyBatis: 分页插件PageHelper直接传递分页参数的用法
一、加分页插件依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.13</version></dependency>二、配置分页插件,并配置相关属性&a…...
Python基于Flask的高校舆情分析,舆情监控可视化系统
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 运行效果图 基于Python的微博大数据舆情分析,舆论情感分析可视化系统 系统介绍 微博舆情分析系…...
Python第一次作业练习
题目分析: """ 参考学校的相关规定。 对于四分制,百分制中的90分及以上可视为绩点中的4分,80 分及以上为3分,70 分以上为2分,60 分以上为1分; 五分制中的5分为四分制中的4分,4分为3分&#…...
InstallShield打包升级时不覆盖原有文件的解决方案
一个.NET Framework的Devexpress UI Windows Form项目,用的InstallShield,前些个版本都好好的,最近几个版本突然就没法更新了,每次更新的时候都覆盖不了原文件,而且这样更新后第一次打开程序(虽然是老程序&…...
服务器巡检表-监控指标
1、巡检指标 系统资源K8S集群NginxJAVA应用RabbitMQRedisPostgreSQLElasticsearchELK日志系统 2、巡检项 检查项目 检查指标 检查标准 系统资源 CPU 使用率 正常:<70% 低风险:≥ 70% 中风险:≥ 85% 高风险:≥ 9…...
无涯教程-JavaScript - DDB函数
描述 DDB函数使用双倍余额递减法或您指定的某些其他方法返回指定期间内资产的折旧。 语法 DDB (cost, salvage, life, period, [factor])争论 Argument描述Required/OptionalCostThe initial cost of the asset.RequiredSalvage 折旧结束时的价值(有时称为资产的残值)。 该…...
uniapp打包微信小程序。报错:https://api.weixin.qq.com 不在以下 request 合法域名列表
场景:在进行打包上传测试时,发现登录失效,但在测试中【勾选不效应合法域名】就可以。 出现原因:我在获取到用户code后,直接使用调用官方接口换取openid 解决方案: 可以把code带给后端,让他们返…...
stm32之31.iic
iic双线制。一根是SCL,作为时钟同步线;一根是SDA,作为数据传输线 SDN #include "iic.h"#define SCL PBout(8)#define SDA_W PBout(9) #define SDA_R PBin(9)void IIC_GPIOInit(void) {GPIO_InitTypeDef GPIO_InitStructure;//使能时钟GR…...
新的 ChatGPT 提示工程技术:程序模拟
即时工程的世界在各个层面上都令人着迷,并且不乏巧妙的方法来推动像 ChatGPT 这样的代理生成特定类型的响应。思想链 (CoT)、基于指令、N-shot、Few-shot 等技术,甚至奉承/角色分配等技巧都是充满提示的库背后的灵感,旨在满足各种需求。 在本文中,我将深入研究一项技术,据…...
基于OpenClaw构建智能家居环境感知系统:从传感器到自动化规则
1. 项目概述与核心价值如果你正在捣鼓一个智能家居系统,尤其是围绕着OpenClaw这类AI助手来构建,那你可能和我一样,经常遇到一个痛点:家里的设备虽然能联网、能控制,但它们大多“又聋又瞎”。空调能开能关,但…...
AbMole丨Apigenin:天然黄酮化合物在氧化应激中的应用
Apigenin(芹菜素)是一种广泛存在于芹菜、洋甘菊、欧芹等植物中的天然黄酮类化合物[1]。Apigenin(CAS No.:520-36-5)具有多种生物活性,其分子机制涉及对多条细胞信号通路的调控,包括PI3K/AKT/mTO…...
Windows外接显示器亮度控制终极指南:使用Twinkle Tray轻松解决Windows系统限制
Windows外接显示器亮度控制终极指南:使用Twinkle Tray轻松解决Windows系统限制 【免费下载链接】twinkle-tray Easily manage the brightness of your monitors in Windows from the system tray 项目地址: https://gitcode.com/gh_mirrors/tw/twinkle-tray …...
AI Coding如何落地APP开发——从个人玩具到公司级降本增效
一、AI 编程能力如何应用到APP开发团队 每天打开新闻都是各种: AI可以取代程序猿、AI可以独立写页面、AI可以独立完成APP,程序员马上要失业了,一个产品经理半天时间就能生成一个带完整页面的活动模块原型;一个运营人员一个小时就…...
除了卸载浏览器,ADB还能帮你清理哪些OPPO手机预装软件?附完整包名清单
深度优化OPPO手机:ADB卸载非必要预装应用全指南 对于追求系统纯净度的OPPO手机用户而言,预装应用往往占据宝贵存储空间并消耗后台资源。本文将系统介绍如何利用Android Debug Bridge(ADB)工具精准管理ColorOS系统中的各类预装组件…...
3分钟上手QrazyBox:让损坏的二维码“起死回生“的终极修复工具
3分钟上手QrazyBox:让损坏的二维码"起死回生"的终极修复工具 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾经遇到过这样的场景:打印出来的二维码被…...
3PEAK思瑞浦 TPA1811-S5TR SOT23-5 精密运放
特性 供电电压:4伏至30伏 低功耗:在25C时为55A(典型值) 低偏置电压:8V在25C(最大值) 零漂:0.01V/C 轨到轨输出 增益带宽积:500kHz 斜率:0.3V/us...
基于Circuit Playground Express与MakeCode的阿基米德螺旋桨智能小船制作
1. 项目概述:当古老智慧遇见现代创客阿基米德螺旋,这个诞生于两千多年前的巧妙发明,最初被用来从低处向高处提水。它的核心原理简单而强大:一个旋转的螺旋面,能将流体或颗粒物沿着轴向“推”动。今天,我们不…...
SPA06-003温压传感器实战:从I2C/SPI接口到Arduino/Python项目开发
1. 项目概述与传感器选型考量在嵌入式开发和物联网项目中,环境参数的精确感知是构建智能系统的第一步。无论是监测室内空气质量、构建个人气象站,还是为无人机提供高度参考,温度和气压数据都是不可或缺的基础信息。市面上传感器选择众多&…...
技能与代码审计融合实践:构建安全开发思维与实战靶场
1. 项目概述:技能与代码审计的融合实践最近在和一些做安全开发的朋友聊天,大家普遍有个感受:现在单纯会写代码,或者单纯懂点安全皮毛,已经越来越不够用了。一个功能上线,开发觉得逻辑完美,但安全…...
