SpringBoot + Websocket + Vue 构建聊天室

前言

  • 关于 WebSocket:
    1、WebSocket 是 html5 提供的通讯协议
    2、特点是建立在单个 tcp 连接上的全双工协议
    3、浏览器向服务器发起 WebSocket 连接请求,当成功获取到连接后,就可以实现浏览器和服务器之间的数据传输
  • 版本
    后端: springboot 2.0
    前端: vue
    测试: Chrome 8:81.0
  • 源码
    后端: 后端源码 github
    前端: 前端源码 github
  • 在线体验地址 (组件管理/聊天室 test 123456)

正文

  • 客户端
    首先,既然要在前端发起一个 websocket 连接请求,那么肯定得有一个实际存在的地址,也就是我们在服务器端配置的链接地址。然后我们通过 var ws = new WebSocket(url) 来获取 websocket 客户端对象,成功获取到连接之后,我们就可以获取 websocket 回调函数,然后进行数据传输。

    • 回调函数
    事件描述
    ws.onopen连接成功之后调用
    ws.onmessage消息发送之后调用
    ws.close连接关闭之后调用
    ws.error发生异常时调用
    • 代码
//初始化 websocket
initWebSocket(id) {this.id = idvar _this = thisif (window.WebSocket) {   //判断当前浏览器是否支持 websocketvar serverHot = window.location.hostname//携带参数  id   userId  userNamevar url = 'ws://' + serverHot + ':8082' + '/api/chat/private/' + id + '/' + this.userId + '/' + this.userNamevar ws = new WebSocket(url)_this.ws = wsws.onopen = function(e) {   //回调函数console.log('连接成功' + url)}ws.onmessage = function(e) {_this.msgList.push(JSON.parse(e.data))   //msgList 为消息列表_this.onlineNum = JSON.parse(e.data).onlineNum   //当前在线人数console.log('发送成功' + url)}ws.onclose = function(e) {console.log('关闭连接' + url)}}
},
//发送消息
sendMsg() {var _this = thisvar params = {content: _this.content}_this.ws.send(JSON.stringify(params))this.content = ''},
  • 服务端
  • 服务端自动注册
    首先早 pom 文件中引入依赖 spring-boot-starter-websocket 。
    ServerEndpointExporter 是由Spring官方提供的标准实现,用于扫描ServerEndpointConfig配置类和@ServerEndpoint注解实例。使用规则也很简单:1.如果使用默认的嵌入式容器 比如Tomcat 则必须手工在上下文提供ServerEndpointExporter。2. 如果使用外部容器部署war包,则不要提供提供ServerEndpointExporter,因为此时SpringBoot默认将扫描服务端的行为交给外部容器处理。
//开启 websocket 服务端自动注册
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}}
  • 创建 websocket 服务端
    创建 WebSocketController
    1、通过注解 @ServerEndpoint 来声明实例化 websocket ,也就是前端 websocket 对象连接时的地址
    2、通过注解 @OnOpen、@OnMessage、@OnClose、@OnError 来声明 websocket 回调函数
  • 代码
@Component
@ServerEndpoint("/chat/private/{id}/{userId}/{userName}")
public class WebSocketController {//群组中的每一个成员的 websocket 连接private static ConcurrentHashMap<String, List<Session>> groupMap = new ConcurrentHashMap<>();//群组中的消息private static ConcurrentHashMap<String, List<MessageDto>> groupMsgMap = new ConcurrentHashMap<>();@OnOpenpublic void onOpen(Session session, @PathParam("id") String id, @PathParam("userId") String userId,@PathParam("userName") String userName) {List<Session> list = groupMap.get(id);if (list != null && list.size() > 0 && list.get(0).getPathParameters().get("userId").equals(userId)) {System.out.println("用户 " + userName + " 再次进入聊天室 " + id);} else {list = groupMap.computeIfAbsent(id, k -> new ArrayList<>());list.add(session);onMessage(id, userId, userName, "{'content':'用户 " + userName + " 上线了';" + "'onlineNum':" + list.size() + "}");System.out.println("用户 " + userName + " 进入聊天室 " + id);}}@OnMessagepublic void onMessage(@PathParam("id") String id, @PathParam("userId") String userId,@PathParam("userName") String userName, String content) {List<Session> list = groupMap.get(id);list.forEach(item -> {MessageDto messageDto = JSON.parseObject(content, MessageDto.class);messageDto.setFromUser(userName);messageDto.setOnlineNum(list.size());String json = JSON.toJSONString(messageDto);try {item.getBasicRemote().sendText(json);} catch (IOException e) {e.printStackTrace();}});System.out.println("用户 " + userName + " 在聊天室 " + id + " 中发送了消息: " + content);}@OnClosepublic void onClose(Session session, @PathParam("id") String id, @PathParam("userId") String userId,@PathParam("userName") String userName) {List<Session> list = groupMap.get(id);list.remove(session);onMessage(id, userId, userName, "{'content':'用户 " + userName + " 下线了'}");System.out.println("用户 " + userName + " 退出聊天室 " + id);}@OnErrorpublic void onError(Throwable throwable) {System.out.println("出错: " + throwable.getMessage());}}
  • 测试
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    • 服务器控制台
      在这里插入图片描述
      后浪 加油!

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

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

相关文章

Geoffrey Hinton、姚期智、张钹、Sam Altman等专家共话AI安全与对齐丨2023智源大会议程公开...

6月9日&#xff0c;2023北京智源大会&#xff0c;将邀请AI领域的探索者、实践者、以及关心智能科学的每个人&#xff0c;共同拉开未来舞台的帷幕&#xff0c;你准备好了吗&#xff1f;与会知名嘉宾包括&#xff0c;图灵奖得主Yann LeCun、OpenAI创始人Sam Altman、图灵奖得主Ge…

In-context learning如何工作?斯坦福学者用贝叶斯方法解开其奥秘

译者 | 黄灿安 单位 | 东北大学自然语言处理实验室 来自 | 机器翻译学堂 进NLP群—>加入NLP交流群 作者&#xff1a;Sang Michael Xie和 Sewon Min 引言 去年底&#xff0c;OpenAI研发的ChatGPT一经面世&#xff0c;在引起了大家惊讶的同时&#xff0c;也纷纷引发大家的思考…

chatgpt赋能python:Python动态规划详解:从入门到精通

Python动态规划详解&#xff1a;从入门到精通 什么是动态规划&#xff1f; 动态规划是一种常用的算法思想&#xff0c;它可以解决一类优化问题&#xff0c;例如路径规划、序列匹配等问题。动态规划算法的基本思路是将复杂的问题分解成若干个子问题&#xff0c;并对每个子问题…

ChatGPT 拓展资料: 强化学习-动态规划算法

ChatGPT 强化学习-动态规划算法 强化学习是一种机器学习方法,可以帮助智能体学习如何在一个环境中做出最优的决策。在强化学习中,动态规划是一种解决问题的方法,策略迭代是其中的一种核心技术。 动态规划可以帮助智能体解决包含多个阶段和决策的问题。在这种问题中,每个阶…

生成式AI“暴走”,BAT兵戎相见?

配图来自Canva可画 事实证明&#xff0c;互联网大厂不会让自己错过任何一个风口。今年以来&#xff0c;各大互联网巨头借着ChatGPT的高热度&#xff0c;吹响了进攻生成式AI赛道的号角。 百度开启对标ChatGPT的大语言模型“文心一言”产品的邀请测试&#xff1b;腾讯AI Lab推出…

ChatGPT们都在用哪些域名?

.chat 点击前往 .chat 首年注册仅售10元 .shop &#xff5c;.art 点击前往 .shop &#xff5c;.art等域名批量注册优惠中 说到AI&#xff0c;随着ChatGPT的风靡&#xff0c;各类AI工具、APP以及相关网站仿佛雨后春笋一般&#xff0c;瞬间遍布互联网的各个角落。 但其实不然&…

《Google Colab 搭建一个自己的ChatGPT》

1、点击文件——新建笔记 2、代码 输入pip install openai&#xff0c;点击运行 3、输入以下代码 import os import openaiopenai.api_key "这是你的api_key请全部删除再粘贴到引号里面来"response openai.ChatCompletion.create(model"gpt-3.5-turbo"…

又一科研利器诞生!能对话的论文阅读器,hammerScholar

文&#xff5c;智商掉了一地 hammerScholar 新升级&#xff0c;用对话式读论文工具提升科研生产力~ 不得不说&#xff0c;自从 AIGC 这个概念出现以来&#xff0c;它极强的内容理解与生成能力也推动着各种生产力工具层出不穷&#xff0c;除了一些浏览器和代码插件以外&#xff…

阿里二面:使用 try-catch 捕获异常会影响性能吗?大部分人都会答错!

大家好&#xff0c;我是老赵 不知道从何时起&#xff0c;传出了这么一句话&#xff1a;Java中使用try catch 会严重影响性能。 然而&#xff0c;事实真的如此么&#xff1f;我们对try catch 应该畏之如猛虎么&#xff1f; 一、JVM 异常处理逻辑 Java 程序中显式抛出异常由athro…

chatgpt赋能python:Python处理照片-提高照片处理效率的神器

Python 处理照片 - 提高照片处理效率的神器 对于任何一个专业摄影师或是业余爱好者而言&#xff0c;照片的拍摄技巧虽然至关重要&#xff0c;但是照片的后期处理过程也是不能忽略的&#xff0c;尤其是对于大量照片的处理来说&#xff0c;这中间会花费大量的时间和精力。在这个…

FusionAI - 好用的 AI 写作伴侣 | 生成增强的 ChatGPT 提示,仅需几秒钟即可提升写作水平

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 Your Al writing companion. Generate enhanced GPT prompts and elevate your writing in seconds. FusionAI 地址&#xff1a;http://www.fusionai.…

OpenGL渲染视频步骤--面试用

一 创建一个显卡可执行程序 有两种着色器Shader&#xff1a;顶点着色器、片元着色器。用的是GLSL语言&#xff0c;运行在显卡上的语言。 创建着色器&#xff0c;编译着色器。CreateShader、CompileShader。 创建程序&#xff0c;附加着色器&#xff0c;连接程序&#xff0c;…

解決Unity中使用AVPro Video切换视频时闪现插件Logo

最近在使用unity 3D 插件AVProVideo播放视频&#xff0c;切换视频的时候会在切换间隔闪现一下插件的Logo&#xff0c;摸索之后找到了解决方法&#xff0c;因此发文介绍一下怎么解决。 代码中使用的是以下方法进行切换 m_MediaPlay.OpenMedia(MediaPathType.RelativeToStreaming…

Axure制作播放器原型图-OpenGL FFmpeg QT Rtmp H264 视频监控 mp4播放

要做一个集成了&#xff1a; 1.视频监控 视频播放云台控制 2.图片浏览yuv jpg bmp 图片处理 锐化 模糊 二值化 3.音频播放 pcm aac 音频分析 处理 4.视频文件播放 视频文件格式分析h264-annexb avi flv mp4 5.流媒体播放 hls webrtc rtsp rtmp 6.视频分析 处理--人脸识别…

【QT项目:视频播放器——Qt opengl编程】通过shader完成显示yuv

通过Qt opengl不是为了3D绘制&#xff0c;而是为了将视频绘制起来 使用opengl 可以极大降低yuv转rgb的转换开销 使用Opengl需要考虑三大问题&#xff1a; 1、QOpenGLWidget&#xff08;与界面如何交互&#xff09; 1、为什么用QT的opengl 简单&#xff0c;界面可以自动叠加 v…

【OpenGL】读取视频并渲染

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍读取视频并渲染。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#…

unity rtsp 视频渲染(一)

unity unity 可以说是一个不错的工具&#xff0c;建立三维的场景非常方便&#xff0c;下面我们建立一个三维的场景&#xff0c;并且在三维的场景中和场景外分别建立系统去播放视频。所谓场景内就是在三维中播放视频&#xff0c;场景外就是在三维场景前表面的二维平面中播放视频…

Unity 视频渲染插件AVPro Movie Capture 简易教程

随着Unity 的 功能日益强大&#xff0c;Unity5的发布使的Unity的图形渲染能力达到了一个新的层次&#xff0c;全局光照的加入&#xff0c;各种新特性的加入&#xff0c;使视频的实时渲染不再是天方夜谈&#xff0c;Unity5发布时的演示视频《Adam》&#xff0c;画质惊人。Unity在…

最新 |《未来简史》作者赫拉利 演讲:AI不需要意识就可以毁灭人类文明 (全文+视频)...

作者&#xff1a;城主 | 编辑&#xff1a;腾讯新闻 郝博阳 编者导语&#xff1a; 最近两个月&#xff0c;自从《暂停AI声明书》发布后&#xff0c;我们看到了诸多AI行业内的专家大佬隔空辩论AI的潜在威胁和治理方法&#xff0c;场面一时无两&#xff0c;基本上把技术路径上AI可…

大模型基础知识 - 语言模型及其演进 公开版

本文为作者内部分享文档&#xff0c;由于不涉敏可以公开&#xff0c;分享本身是课程形式&#xff0c;有什么疑问欢迎在评论区留言。 开场白 人工智能发展到现在&#xff0c;在2个重要领域取得了重大突破&#xff0c;有望达到人类水平&#xff1a; 计算机视觉 &#xff08;Com…