黑马基于Web-socket的java聊天室基本解析
要是用Web-socket协议,我们要前端upgrade升级成web-socket协议
首先我们要引入springboot的websocket起步依赖,这样子方便使用,自己指定版本注意
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId></dependency>
我们先从我们的配置类来看看,有两个配置类
注册成bean对象,是ServerEndpoint注解生效

通过在配置类中定义一个 ServerEndpointExporter 的 @Bean 方法,Spring 会自动创建一个 ServerEndpointExporter 实例,并将其加入到 Spring 容器中。这样,Spring 在启动时就会自动扫描应用中所有标注了 @ServerEndpoint 注解的类,并且将它们注册为 WebSocket 端点。
这段代码的作用是通过 ServerEndpointExporter 将标注了 @ServerEndpoint 注解的类注册为 WebSocket 端点,从而使这些类能够处理 WebSocket 请求。
重写 modifyHandshake 方法,重写我们一开始建立握手的时候我们的操作内容

在该类中,重写了 modifyHandshake 方法。
modifyHandshake 方法在 WebSocket 握手过程中被调用,用于修改握手请求和响应。
然后我们修改后方法的逻辑是,我们的WebSocket协议握手的时候,我们把Session保存起来
然后我们来看看我们的实现Web-socket协议的类

首先就是我们的 @ServerEndpoint注解
ServerEndpoint注解用来标识它是一个WebSocket路径
后面的两个参数分别是
第一个,指定我们的WebSocket端点的路径为/chat
第二个,指定我们的配置类
我们用基于注解的方式来实现WebSocket
- OnOpen 握手开始前
- OnClose 握手结束后
- OnError 握手错误时
- OnMessage 握手时
- 四个常用注解
注意这个Session session不是HttpSession,而是我们的WebSocket的session



我们来解释一下这个项目的基本逻辑
我们登录时,会把我们的登录名username存到HttpSession里面
然后我们用户登录后,我们执行的就是刚刚的OnOpen注解下的方法
我们将把你登录的消息推送给别人,类似于QQ那种好友已经上线一样

我们会把登陆的所有用户的Session存储到一个Map里面,我们用 private static final来定义
因为我们多个用户创建的时候,他是多例,会创建多个,但是我们想要一个东西全局存储所有的用户,而private static final修饰的东西是单例的,不管谁来存取,数据都是一样的

我们用户登录后,先把它的session存到这个Map里面
然后广播给其他用户,让他们知道我已经登陆了
看看这段代码里面的部分方法
把我们存用户的Map变成Set,这个Set集合里面存的是我们的所有用户的session

然后这个是我们广播给其他用户我们已经登录的逻辑
逻辑就是,我们把Map里面存的Session全都拿出来,然后我们往我们的Session里面发送信息。
其实我们给不同的Seesion发送消息,就是给我们的不同的好友发送消息
session.getBasicRemote().sendText(message) 的作用就是将指定的文本消息内容通过 WebSocket 会话发送给客户端,客户端收到消息后可以进行相应的处理。

所以类似,我们的OnClose,就是我们下线的时候,广播我们下线了,逻辑和上面是一样的

然后我们来看看聊天室的逻辑
也就是我们的OnMessage注解下面的方法

其实当我们点击前端标签的我们的好友的时候
例如这样,我们正在和dada聊天,这个dada其实就对应我们的上面的toName,也就是你要发送信息给谁
Message的信息在我们的对话框里面
然后我们的String user其实就是我们登录的时候,往session里面存的用户名


我们这步就是拿到我们要发送的对象的session

然后我们就往对应的好友那发送消息了
所以这个项目,其实就是我们基于Session来做登录,然后用不同的Session来对应不同的用户
/chat是我们的websocket实时传输路径,/chat这个路径我们来实现我们的WebSocket协议来实时传输我们的信息
看看我们的前端代码,我们这样来拿到我们的实时信息,也就是往/chat这个路径申请
所以我们在这个界面的时候,可以实现实时聊天,然后用户上下线我们也可以实时反应
相关文章:
黑马基于Web-socket的java聊天室基本解析
要是用Web-socket协议,我们要前端upgrade升级成web-socket协议 首先我们要引入springboot的websocket起步依赖,这样子方便使用,自己指定版本注意 <dependency><groupId>org.springframework.boot</groupId><artifactId&…...
【操作系统期末速成】内存管理|内存的装入模块在装入内存的方式|分配管理方式|页面置换算法|页面置换
🎥 个人主页:深鱼~🔥收录专栏:操作系统🌄欢迎 👍点赞✍评论⭐收藏 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…...
图和网络笔记
文章目录 1. A X 0 AX0 AX02. A T Y 0 A^TY0 ATY03. A X 0 AX0 AX0和 A T Y 0 A^TY0 ATY0的关系 1. A X 0 AX0 AX0 一个图可以由节点和边组成,假设我们有一个节点notes :n4,边edges:m5的有向图,表示如下 通过以上电路…...
请求外部系统报错
报错信息: nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.NoSuchMethodError: com.google.common.net.HostAndPort.getHostText()Ljava/lang/String; 在网上看了好几篇文章,和我的都不符合。 后面自己发现是我的系…...
电路板维修【四】
【开关电源输出电压偏低不稳,用示波器立马锁定故障范围】:https://www.bilibili.com/video/BV1pf421D73K?vd_source3cc3c07b09206097d0d8b0aefdf07958 可以用示波器查看MOS的输出波形来查看其是否损坏: 电源芯片的供电电压来回跳变…...
(程序设计语言)传值、传引用
1、传值(传递值): 在传值的情况下,函数接收到的是参数的一个副本,而不是参数本身。这意味着函数内部对参数的修改不会影响到原始值。传值通常用于基本数据类型(如整数、浮点数、布尔值等)的传递…...
一次基类类型对象无法被传递问题的分析
看下面一段代码: // proj2.cpp #include <iostream> using namespace std; class CharShape { public:CharShape(char ch) : _ch(ch) {};virtual void Show() 0; protected:char _ch; // 组成图形的字符 }; class Triangle : public CharShape { public:Tr…...
windows设置Redis服务后台自启动
问题 在日常开发过程中,redis是我们常用的缓存工具,但是由于redis对于Linux系统进行开发的,在Linux系统里可以通过修改redis.conf从而从而实现后台启动。 daemonize no 改成 daemonize yes 但是在window上如何也进行后台运行呢,…...
掌握Linux常用命令,扫平面试需求障碍
cd 切换目录。 > cd ../ #切换到父级目录 > cd /tmp # 切换到/tmp目录 > cd ~ # 切换到当前用户的家目录 ls命令 查看文件与目录的命令,list 的缩写。 > ls -l #列出长数据串,包含文件的属性与权限数据等 > ls -a #列出隐藏…...
c语言之文件打开模式
在c语言中,文件打开模式如下 r读模式: 允许对文件读取信息。若文件不存在,则会报错 w写模式: 允许向文件写入信息,若文件不存在,则创建一个文件 #include<stdio.h>int main() {FILE *fp;int i;char ay;fpfo…...
与禹老师学前端vue3学习汇总
24.5.15: 创建Vue3工程 1.确定自己电脑有没有nodejs环境,在cmd中输入node,如果出现Node.js的版本号说明已经有这个环境了,否则搜索Node.js安装 2.先在D盘创建一个文件夹Vue3_Study,然后在这个空文件夹中右键选择终端…...
Linux网络编程——HTTP协议的理解与运用
目录 前言 一、认识URL 二、认识HTTP样例 三、HTTP的报头内容 1.url 2. Content-Type 3.Method 方法 1.GET方法 2.POST方法 4、状态码 5.cookie和session 前言 我们知道,协议就是一种约定,客户端与服务端统一的用这种约定进行传输数据。我们…...
RestTemplate接口请求发送json、form数据格式以及处理接口错误状态码400 null
在使用RestTemplate发送HTTP请求时,你可以通过不同的方式发送JSON或表单数据(application/x-www-form-urlencoded)。同时,处理接口错误状态码(如400)和返回null的情况也是很重要的。以下是一些示例代码&…...
《Python编程从入门到实践》day29
# 昨日知识点回顾 修改折线图文字和线条粗细 矫正图形 使用内置格式 # 今日知识点学习 15.2.4 使用scatter()绘制散点图并设置样式 import matplotlib.pyplot as plt import matplotlib matplotlib.use(TkAgg)plt.style.use(seaborn-v0_8) # 使用内置格式 fig, ax plt.subpl…...
UIKit之图片浏览器
功能需求 实现一个图片浏览器,点击左右按钮可以切换背景图,且更新背景图对应的索引页和图片描述内容。 分析: 实现一个UIView的子类即可,该子类包含多个按钮。 实现步骤: 使用OC语言,故创建cocoa Touch类…...
如何查看SNMP设备的OID
什么是OID和MIB OID OID 代表对象标识符。 OID 唯一地标识 MIB 层次结构中的托管对象。 这可以被描述为一棵树,其级别由不同的组织分配。MIB MIB(管理信息基)提供数字化OID到可读文本的映射。 使用MIB Browser扫描OID 我的设备是一台UPS SN…...
什么?你设计接口什么都不考虑?
如果让你设计一个接口,你会考虑哪些问题? 1.接口参数校验 接口的入参和返回值都需要进行校验。 入参是否不能为空,入参的长度限制是多少,入参的格式限制,如邮箱格式限制 返回值是否为空,如果为空的时候是…...
2024年3月 青少年等级考试机器人理论真题二级
202403 青少年等级考试机器人理论真题二级 第 1 题 一个机器小车,用左右两个电机分别控制左右车轮,左侧电机转速是100rpm,右侧电机转速是50rpm,则此机器小车?( ) A:原地右转 B&am…...
C语言学习【printf函数和scanf函数】
C语言学习【printf函数和scanf函数】 printf()函数和scanf()函数可以让用户与程序交流,是输入/输出函数 printf()函数 请求printf()函数打印数据的指令要与待打印数据的类型相匹配。例如,打印整数时使用%d,打印字符时使用%c。这些符号被称…...
shell正则表达式
sort命令 以行为单位对文件内容进行排序,也可以根据不同的数据类型来排序 比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 sort 对行内容进行升序排序 XXX | sort 选项 sort 选项 文件 常用选项&#x…...
告别复杂设置!Sunshine v0.21.0 + Moonlight安卓版:5分钟搞定家庭局域网游戏串流
5分钟极简指南:用Sunshine和Moonlight打造家庭游戏串流系统 客厅的沙发上,手机屏幕突然变成了你的高性能游戏PC——这不是科幻电影,而是每个家庭都能实现的游戏串流体验。过去需要复杂网络知识才能搭建的串流系统,如今借助Sunshin…...
从静态地图到动态避障:图解ROS中global_costmap与local_costmap如何协同工作
从静态地图到动态避障:图解ROS中global_costmap与local_costmap如何协同工作 在机器人自主导航领域,理解代价地图的工作原理是构建可靠导航系统的关键。想象一下,当人类在陌生城市中导航时,我们会同时参考静态的城市地图和实时观察…...
2026年版|Java程序员转行大模型开发:从入门到实践(小白必收藏)
在2026年人工智能(AI)技术持续爆发的当下,大模型已从“前沿概念”全面渗透到企业实际应用中,成为驱动数字化转型的核心动力。对于长期深耕Java领域的程序员而言,从传统Java开发转向大模型开发,不再是“可选…...
C# + OpenCVSharp实战:搞定工业零件旋转角度匹配(附完整源码)
C# OpenCVSharp工业视觉实战:高精度旋转零件匹配的工程化实现 在自动化生产线中,零件定位的准确性直接关系到装配质量和生产效率。当数以千计的金属零件以随机角度通过传送带时,传统的人工检测或固定角度的模板匹配方法往往束手无策。某汽车…...
从八皇后到N皇后:深度优先搜索(DFS)的经典实战与优化技巧
从八皇后到N皇后:深度优先搜索(DFS)的经典实战与优化技巧 在国际象棋的64格棋盘上放置8个互不攻击的皇后,这个看似简单的谜题背后隐藏着组合数学的深邃奥秘。当我们将问题扩展到NN棋盘上的N皇后问题时,它便成为了检验算法效率的绝佳试金石。本…...
终极ncmdumpGUI指南:3步快速解密网易云音乐NCM文件
终极ncmdumpGUI指南:3步快速解密网易云音乐NCM文件 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI ncmdumpGUI是一款基于C#开发的Windows图形界面工…...
TVA智能体范式的工业视觉革命(5)
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
互联网大厂 Java 面试:搞笑程序员与严肃面试官的较量
面试荒唐记:从 Java SE 到微服务的奇妙之旅在某个互联网大厂的面试现场,严肃的面试官和搞笑的程序员燕双非展开了一场针锋相对的较量。从Java SE到微服务,燕双非用他机智的回答打破了沉闷的气氛,然而在复杂问题面前又显得有些捉襟…...
RAG知识库生命周期①【第七篇】:文档新增修改删除,生产级向量同步更新方案
生产级 RAG 避坑实战合集【第七篇】文章简介:前面六篇我们搞定了文档解析、去重、文本清洗、Chunk切块、结构化元数据。绝大多数项目卡在这一关:文档内容变了怎么办?制度修改、数据订正、条款作废、资料更新。Demo可以删库重灌,生…...
CH398X:USB3.2 Gen1 转千兆以太网 高集成国产芯片方案
一、前言轻薄本、平板、工控机、扩展坞、嵌入式主板等设备,普遍需要高速 USB 扩展千兆有线网口来满足大文件传输、直播推流、工业实时通信的低延迟稳定需求。传统转接方案存在外围复杂、功耗偏高、兼容性差、工控环境不稳定、国产化替代难等痛点。沁恒微电子&#x…...
