黑马基于Web-socket的java聊天室基本解析

news2024/11/25 0:40:41

要是用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这个路径申请

所以我们在这个界面的时候,可以实现实时聊天,然后用户上下线我们也可以实时反应

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

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

相关文章

绘唐3启动器怎么启动一键追爆款3正式版

绘唐3启动器怎么启动一键追爆款3正式版 工具入口 一.文案助手&#xff1a; 【注意&#xff01;&#xff01;】如果图片无显示&#xff0c;一般情况下被杀毒拦截&#xff0c;需关闭杀毒软件或者信任文件路径。 win10设置排除文件&#xff1a; 1.【新建工程】使用前先新建工程…

std::ref和std::cref的使用和原理分析

目录 1.用法 2.std::reference_wrapper介绍 3.std::ref原理分析 4.std::cref原理分析 5.总结 1.用法 它的定义如下&#xff1a; std::ref&#xff1a;用于包装按引用传递的值。 std::cref&#xff1a;用户包装按const引用传递的值。 C本身就有引用&#xff08;&&#…

使用 Python 中的 TensorFlow 检测垃圾短信

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

【鸿蒙开发】第二十四章 IPC与RPC进程间通讯服务

1 IPC与RPC通信概述 IPC&#xff08;Inter-Process Communication&#xff09;与RPC&#xff08;Remote Procedure Call&#xff09;用于实现跨进程通信&#xff0c;不同的是前者使用Binder驱动&#xff0c;用于设备内的跨进程通信&#xff0c;后者使用软总线驱动&#xff0c;…

一个基于servlet的MVC项目-登录验证

一、MVC的概念 MVC是Model、View、Controller的缩写&#xff0c;分别代表 Web 应用程序中的3种职责1 模型:用于存储数据以及处理用户请求的业务逻辑。 2视图:向控制器提交数据&#xff0c;显示模型中的数据。 3控制器:根据视图提出的请求&#xff0c;判断将请求和数据交给哪个…

Linux下网络命令

目录 需求1-查看本机是否存在22端口解法1解法2解法3 需求2-查看其他主机是否存在22端口解法1解法2解法3 需求3-查看TCP连接解法1/2 需求4-统计80端口tcp连接次数解法 需求5-查看总体网络速度解法 需求6-查看进程流量解法 需求7-dns解法 需求8-traceroute到baidu解法 需求9-查看…

git仓库使用

git仓库是会限制空间大小限制的 git网络库的容量限制_github仓库大小限制-CSDN博客 git是用于管理github的工具 电脑左下角搜索git打开GitBash.exe 进入到要下载到本地的目录 下载到本地的文件不要更改&#xff01; 如果要使用请务必把文件复制到别的空间去再在这个别的空间…

centos7中查询Nacos的安装路径和配置信息如何查找?

在 CentOS 7 上查询 Nacos 的安装路径和配置信息通常涉及几个步骤。这些步骤主要依赖于你是如何安装 Nacos 的&#xff08;比如使用压缩包还是 Docker 等方式&#xff09;。下面是一些通用的方法来帮助你找到 Nacos 的安装路径和配置信息&#xff1a; 1. 查找 Nacos 的安装路径…

智能自助终端主板RK3288/RK3568在酒店前台自助机方案的应用,支持鸿蒙,支持免费定制

酒店前台自助机解决方案是一款基于自助服务终端&#xff0c;能够让客人通过简单的操作完成入住登记/退房的解决方案&#xff0c;大幅提高酒店的工作效率&#xff0c;提升客人体验&#xff0c;降低人力成本。 该方案解决了以下传统前台登记入住方式的痛点&#xff1a; 1、人流量…

elasticsearch 动态映射

文章目录 动态映射动态映射的弊端静态映射实战&#xff1a;映射创建后还可以更新吗 动态映射 动态映射的核心是在自动检测字段类型后添加新字段 哪些字段类型支持动态检测呢&#xff1f; 答&#xff1a;boolean类型、float类型、long类型、Object类型、Array类型、date类型、…

Hive-表设计优化

Hive-表设计优化 1.Hive查询基本原理 Hive的设计思想是通过元数据解析描述将HDFS上的文件映射成表。 基本的查询原理是当用户通过HQL语句对Hive中的表进行复杂数据处理和计算时&#xff0c;默认将其转换为分布式计算MapReduce程序对HDFS中的数据进行读取处理的过程。 当执行…

黑马甄选离线数仓项目day02(数据采集)

datax介绍 官网&#xff1a; https://github.com/alibaba/DataX/blob/master/introduction.md DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。 DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre…

48-Qt控件详解:Buttons Containers2

一 Group Box:组合框 #include "widget.h"#include<QGroupBox> #include<QRadioButton> #include<QPushButton> #include<QVBoxLayout>//可以在水平方向和垂直方向进行排列的控件&#xff0c;QHBoxLayout/QVBoxLayout #include <QGridLa…

Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 解锁版 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 解锁版 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 解锁版 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 解锁版 (视…

新增柱线组合图、象限图,新增钉钉、飞书、企业微信客户端免密登录,DataEase开源数据可视化分析工具v2.6.0发布

2024年5月13日&#xff0c;人人可用的开源数据可视化分析工具DataEase正式发布v2.6.0版本。 这一版本的功能升级包括&#xff1a;图表方面&#xff0c;新增了柱线组合图、象限图&#xff1b;仪表板方面&#xff0c;支持批量拖拽字段&#xff0c;外部参数新增支持配置过滤组件&…

云原生基础设施和操作系统分论坛 03-在Kubernetes上运行Apache Spark进行大规模数据处理的实践【数据分析】

https://spark.apache.org/视频观看&#xff1a;https://www.bilibili.com/video/BV17J4m1n7Gv/?spm_id_from333.999.0.0 简介 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop…

/proc/modules文件

/proc/modules文件中列出了内核加载的所有模块的信息&#xff0c;与使用lsmod命令类似。 第一列&#xff1a;模块名称 第二列&#xff1a;模块使用的内存大小&#xff0c;单位是bytes 第三列&#xff1a;模块被load的次数 第四列&#xff1a;是否有其他模块依赖此模块&#…

git使用及github

文章目录 操作命令基本组成框架在开发中git分支的重要性 github的使用将本地仓库关联到远程仓库将远程仓库关联到本地和拉取指定分支、切换远程分支提交本地仓库到远程仓库修改分支名称 保存当前工作切换分支将别的分支修改转移到自己的分支远程删除分支后本地git branch -a依然…

基于NTP服务器获取网络时间的实现

文章目录 1 NTP1.1 简介1.2 包结构1.3 UNIX 时间戳和NTP时间戳 2 代码实现2.1 实现步骤2.2 完整代码 3 结果 在某些场景下&#xff0c;单片机需要通过网络获取准确的时间进行数据同步&#xff0c;例如日志记录、定时任务等。然而&#xff0c;单片机本身无法直接获得准确的标准时…

Vue+springboot的批量删除功能

vue前台 <div style"margin-bottom: 10px"><el-button type"primary" plain click"handleAdd">新增</el-button><el-button click"delBatch" type"danger" plain style"margin-left: 5px"…