关于SpringBoot整合Websocket实现简易对话聊天窗

news2024/12/23 4:17:12

在这里插入图片描述

前言

官网链接:Websocket
Websocket 是什么?它可以将两个独立的浏览器窗口作为通信的两端。 这种形式的通信与传统的 HTTP、TCP 所不同。传统的 HTTP 请求—响应协议是无法实现实时通信的,也就是说,只能由客户端向服务端发送请求,服务端做出响应,再将响应返回给客户端。因此在 Web 开发中,如果需要实时更新消息,只能通过不断刷新页面或者轮询的方式实现,这样会导致大量的用户请求,极大的浪费服务器资源,同时也会增加网络负荷。
在这里插入图片描述

准备工作

  • vue
  • springboot
  • IntelliJ IDEA

后端实现

1.创建SpringBoot项目

使用 IntelliJ IDEA 创建一个 SpringBoot 项目,修改 pom.xml 文件,加入 WebSocket 依赖。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

创建一个 WebSocketConfig 类并且与 @Configuration 注解一起使用。通过 WebSocketHandlerRegistry 对象的 addHandler() 方法注册一个处理器 ChatHandlersetAllowedOrigins("*") 允许任何域名访问。

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new ChatHandler(), "/chat").setAllowedOrigins("*");
    }
}

2.创建Websocket处理器

对于每个 WebSocket 连接,都会创建一个实例来处理协议。可以使用 @Component 注解简单的将处理器注册为 Spring 的 Bean,然后在 WebSocket 配置中通过 new ChatHandler() 方式注入。
我们在 ChatHandler 里面监听网络事件,当客户端向唯一的WebSocket端点发送消息时,通过Session.sendMessage(TextMessage message)发送消息,在服务器端接收消息时,使用 TextMessage.getPayload() 方法获取消息体内容,使用Session.getBasicRemote().sendText() 将消息发送到客户端。

@Component
public class ChatHandler extends TextWebSocketHandler {
    private static final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();

    //连接成功调用
    @Override
    public void afterConnectionEstablished(WebSocketSession session) {
        sessions.put(session.getId(), session);
    }

    //接收消息处理消息
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message)
            throws Exception {
        for (WebSocketSession s : sessions.values()) {
            s.sendMessage(new TextMessage("用户 : "+message.getPayload()));
        }
    }

    //连接关闭调用
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
        sessions.remove(session.getId());
    }
}

前端实现

1.初始化 vue 项目

在 vue 项目中,我们装 vue-websocket 包并且 import

import VueWebSocket from 'vue-websocket'
Vue.use(VueWebSocket, 'ws://localhost:8080/chat', {
  reconnection: true,
  reconnectionAttempts: 5
})

2.实现页面代码

接下来,我们创建一个简单的聊天聊天窗口,包含输入框,发送按钮以及一个消息列表。在用户键入消息后,可以通过 .send() 方法将消息发送到Springboot服务器端。

<template>
    <div class="chat-container">
        <div class="chat-msgs">
            <div v-for="msg in msgs" :key="msg.id" class="chat-msg">
                <span>{{ msg.user }}</span>
                <span>{{ msg.message }}</span>
            </div>
        </div>
        <div class="chat-input">
            <input v-model="message" type="text" placeholder="输入你的消息" />
            <button @click="sendMsg">发送</button>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            message: '',
            msgs: []
        }
    },
    methods: {
        sendMsg() {
            this.$socket.send(this.message)
            this.msgs.push({
                id: this.msgs.length,
                user: '我',
                message: this.message
            })
            this.message = ''
        }
    },
    sockets: {
        message(data) {
            this.msgs.push({
                id: this.msgs.length,
                user: '服务端',
                message: data
            })
        }
    }
}
</script>

<style>
.chat-container {
    display: flex;
    flex-direction: column;
    height: 100%;
}

.chat-msgs {
    flex: 1;
    overflow-y: auto;
    margin-bottom: 10px;
}

.chat-msg {
    background-color: #F6F6F6;
    padding: 5px;
    border-radius: 10px;
    margin: 5px;
}

.chat-input {
    display: flex;
    justify-content: center;
}

.chat-input input {
    flex: 1;
    margin-right: 10px;
    padding: 5px;
}

.chat-input button {
    padding: 5px 15px;
    border: none;
    background-color: #4169E1;
    color: #fff;
    border-radius: 5px;
    cursor: pointer;
}
</style>

启动应用程序

启动 SpringBoot 应用程序,然后通过 npm run serve 启动客户端应用程序。打开两个标签页,在页面中输入消息并发送,可以看到两个窗口中的消息相互更新,实现了简单的实时通信。

总结

通过本次实战,我们学习了如何在 SpringBoot 应用程序中使用 WebSocket 实现简单的实时通信,同时将 vue 与 WebSocket 搭配使用,从而完成一个实时聊天窗口。

实时通讯在现代化 Web 应用程序中越来越重要,WebSocket 技术已经成为了主流解决方案。相信通过本文的学习,您已经对 WebSocket 有所了解,并能够将其应用到 Web 开发中。

有需要的小伙伴可以私信我功能模块的代码哦 

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

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

相关文章

前端Web开发,HTML,css,JavaScript

web浏览器响应流程&#xff0c;及技术不同的浏览器&#xff0c;内核不同&#xff0c;对于相同的前端代码解析的效果会存在差异web标准&#xff0c;三个组成部分 HTML&#xff1a;负责网页的结构&#xff08;页面元素和内容&#xff09;CSS&#xff1a;负责页面的表现&#xff0…

VC调试方法大全

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

代码随想录算法训练营第四十八天| 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

文章目录 198.打家劫舍213.打家劫舍II337.打家劫舍III 198.打家劫舍 题目链接&#xff1a;代码随想录 解题思路&#xff1a; 1.dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i] 只是考虑&#xff0c;不一定偷 2.递推…

【STM32CubeMX】F103外部中断

前言 本文记录下我学习STM32CubeMX时的流程&#xff0c;方便以后回忆。系统板是基于STM32F103C6T6。本章记录外部中断。 步骤 该实验步骤以&#xff0c;配置PA1为外部中断下降沿触发事件&#xff0c;在触发事件后点亮板载PC13LED灯 时钟配置和生成文件配置之类的&#xff0c;其…

3.6 cache存储器

学习步骤&#xff1a; 我会采取以下几个步骤来学习Cache存储器&#xff1a; 确定学习目标&#xff1a;Cache存储器作为一种高速缓存存储器&#xff0c;通常用于提高计算机系统的运行效率。因此&#xff0c;我需要明确学习Cache存储器的目的&#xff0c;包括了解其原理、结构和…

No.054<软考>《(高项)备考大全》【冲刺8】《软考之 119个工具 (6)》

《软考之 119个工具 &#xff08;6&#xff09;》 99.应急应对策略:100.风险在评估:101.风险审计:102.偏差和趋势分析:103.技术绩效测量:104.自制或外购分析:105.市场调研:106.投标人会议:107.建议书评价技术:108.独立核算:109.广告:110.采购谈判:111.合同变更控制系统:112.采购…

定位图像坐标系和角度误区

坐标系和角度的常见误区 在学习halcon的时候.常常看文档的时候,会有一些地方比较疑感有些常用的地方有细微的差距,一不留意。就会导致计算的数据出错 常见的误区就在坐标系和角度 halcon的帮助情况 存在Px,Py 大家不要被搞混乱 Px -> Row Py-> Column 很多人定位项…

C语言——字符串及字符函数的介绍

C语言——字符串及字符函数的介绍 一、字符函数1.strlen1.1strlen的使用1.2strlen的三种模拟实现1.2.1计数器实现strlen函数1.2.2递归方法实现strlen函数1.2.3指针方法实现strlen函数 1.3 注意事项 2.strcpy2.1strcpy使用2.2strcpy的模拟实现2.3strcpy的注意事项 3.strcat3.1st…

【小样本分割 2022 ECCV】SSP

文章目录 【小样本分割 2022 ECCV】SSP摘要1. 介绍2. 相关工作3. 自支持小样本语义分割3.1 动机3.2 自支持原型-SSM3.3 自适应自支持背景原型-ASBP3.4 自支持匹配-SSL 3. 代码 【小样本分割 2022 ECCV】SSP 论文题目&#xff1a;Self-Support Few-Shot Semantic Segmentation 中…

SpringCloud 微服务系列——【Gateway、Config组件使用】

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

第二十三章 材质

3D模型主要是通过材质&#xff08;Material&#xff09;和贴图&#xff08;Texture&#xff09;来表现其精美的外表&#xff0c;说白了就是一张“画皮”而已。我们之前的DirectX课程中介绍过材质&#xff0c;它实际就是对光的反射率&#xff0c;这样简单的设置并不能展现3D模型…

Linux线程 概念、特点、线程间资源共享情况

1. 线程概念 线程是轻量级的进程&#xff1b;Linux中&#xff0c;线程本质上仍是进程。 进程是OS分配资源的最小单位&#xff0c;线程是OS调度的最小单位。 NPTL 当前Linux线程库为redHat开发的NPTL&#xff0c;查看本地线程库版本&#xff1a; getconf GNU_LIBPTHREAD_VE…

【C++】三元操作符、创建并初始化C++对象、C++new关键字

C的三元操作符 if的语法糖 例1 #include <iostream> #include <string>static int s_Level 1; static int s_Speed 2;int main() {if (s_Level > 5){s_Speed 10;}else{s_Speed 5;}std::cin.get(); }用三元操作符&#xff1a; s_Speed s_Level > 5 ?…

基础篇-并发篇

**63.线程状态 添加主线程和子线程 ** 65.线程状态 核心线程和任务队列都是有上限的&#xff0c;所以都满了话就开始使用救急线程; 救急线程也是有上限的&#xff0c;如果再来新的线程的话就需要拒绝策越; 注意&#xff1a;这里不需要等待5000ms&#xff0c;几乎是同时打印 注…

[230503] 2021年托福阅读真题第1篇|Grinding Grain 磨粒

11:21&#xff5e;11:41 慢 20min 正确率&#xff1a;6.5/10 题目来源&#xff1a;链接: https://pan.baidu.com/s/15FYCuD7__slfGvdsBIHgLQ 提取码: iynj --来自百度网盘超级会员v5的分享【内含2021年100篇托福阅读真题】 目录 Grinding Grain 题目 Grinding Grain It now…

2016 ICPC合肥站 传递 HDU-5961(拓扑排序 / bitset / 暴力(可hack))

题目链接&#xff1a;HDU-5961 传递 中文题面就不解释题目意思&#xff0c;解释一下名词的意思 完全图&#xff1a;对于一个无向图 G G G 而言&#xff0c;设点集为 V V V&#xff0c;点集中任意不相同两点 u , v u, v u,v 间都有且仅有一条边叫做完全图。 竞赛图&#xff1…

【玩转Git三剑客笔记】第一章 Git基础

第一章 Git基础 1.综述2.安装Git3.使用Git之前需要做的最小配置4.创建第一个仓库并配置local用户信息1.创建Git仓库2.设置Git最小配置 5.通过几次commit来认识工作区和暂存区1.将工作区中所有已经被git追踪的文件一起添加到暂存区2.git log查看提交日志 6.给文件重命名的简便方…

密码学【java语言】初探究

文章目录 前言一 密码学1.1 古典密码学1.1.1 替换法1.1.2 移位法1.1.3 古典密码破解方式 二 近代密码学2.1 现代密码学2.1.1 散列函数2.1.2 对称密码2.1.3 非对称密码 二 凯撒加密的实践2.1 基础知识&#xff1a;ASCII编码2.2 ascii编码演示2.3 凯撒加密和解密实践2.4 频率分析…

安装Ubuntu22.04虚拟机的一些常见问题解决方法

文章目录 VirttalBox 开启共享剪切板文件夹、拖放的功能VirtualBox 安装 ubuntu后安装增强工具无效的解决办法解决ubuntu您没有权限查看“ 某某文件夹”的内容所需的权限linux更换源的两种方法[如何在 Ubuntu 20.04 上安装 Visual Studio Code - ](https://zhuanlan.zhihu.com/…

【Java入门合集】第二章Java语言基础(二)

【Java入门合集】第二章Java语言基础&#xff08;二&#xff09; 博主&#xff1a;命运之光 专栏JAVA入门 学习目标 掌握变量、常量、表达式的概念&#xff0c;数据类型及变量的定义方法&#xff1b; 掌握常用运算符的使用&#xff1b; 掌握程序的顺序结构、选择结构和循环结构…