SpringBoot+Vue+WebSocket编写简单在线聊天室

WebSocket 简单入门

websocket 应用场景:社交订阅、多玩家游戏、协同编程/编辑、点击数据流、股票基金报价、体育实况更新、多媒体聊天、基于位置的应用、在线教育等等。

参考:https://blog.csdn.net/resilient/article/details/85613446

online-chatroom 效果图

简单做一下:

在这里插入图片描述

前端

socket = new WebSocket('ws://localhost:9999/ws/demo')// 建立连接的回调
socket.onopen = function () {
}
// 收到消息的回调
socket.onmessage = function (msg) {// 拿到消息,更新UIlet data = JSON.parse(msg.data)// 处理消息// ...
}
// 发生错误的回调
socket.onerror = function () {alert('onerror, ws 发生了错误')
}
// 关闭的回调
socket.onclose = function () {console.log('连接已关闭')
}

后端

引入依赖

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

使用 websocket 依赖提供的 @ServerEndpoint@OnOpen@OnClose@OnMessage 等注解,结合 WebSocket 生命周期进行业务方法编写。与 socket 编程相似,无非是什么阶段干什么事。

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;/*** @author websocket服务*/
@ServerEndpoint(value = "/ws/{username}")
@Component
public class WebSocketServer {/*** 记录当前在线连接*/public static final Map<String, Session> SESSION_MAP = new ConcurrentHashMap<>();private static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);/*** 连接建立成功调用的方法** @param session* @param username*/@OnOpenpublic void onOpen(Session session, @PathParam("username") String username) {if (username == null || "".equals(username) || SESSION_MAP.containsKey(username)) {log.info("重复加入,或用户名无效,当前用户已加入 {}", username);try {JSONObject jsonObject = new JSONObject();jsonObject.set("msg", "username不合法");sendMessage(jsonObject.toString(), session);session.close();} catch (IOException e) {log.error("关闭失败", e);}return;}SESSION_MAP.put(username, session);log.info("新增会话,用户[{}], 当前在线人数为:{}", username, SESSION_MAP.size());// 刷新用户列表:将当前所有用户信息发送给客户端JSONObject result = new JSONObject();JSONArray array = new JSONArray();for (Object key : SESSION_MAP.keySet()) {JSONObject jsonObject = new JSONObject();jsonObject.set("username", key);// {"username", "zhang", "username": "admin"}array.add(jsonObject);}result.set("users", array);// {"users": [{"username": "zhang"}, {"username": "admin"}]}sendMsg2All(JSONUtil.toJsonStr(result));}/*** 连接关闭调用的方法** @param session* @param username*/@OnClosepublic void onClose(Session session, @PathParam("username") String username) {SESSION_MAP.remove(username);log.info("连接关闭,移除[{}]的用户会话, 当前在线人数为={}", username, SESSION_MAP.size());}/*** 收到客户端消息后调用的方法* 后台收到客户端发送过来的消息* onMessage 是一个消息的中转站* 接收浏览器端 socket.send 发送过来的 json数据** @param message 客户端发送过来的消息*/@OnMessagepublic void onMessage(String message, Session session, @PathParam("username") String username) {log.info("收到消息,来自[{}]的消息[{}]", username, message);JSONObject obj = JSONUtil.parseObj(message);// to表示发送给哪个用户,比如 adminString toUsername = obj.getStr("to");// 发送的消息文本  helloString text = obj.getStr("text");// {"to": "admin", "text": "聊天文本"}// 根据 to用户名来获取 session,再通过session发送消息文本Session toSession = SESSION_MAP.get(toUsername);if (toSession != null) {// 服务器端 再把消息组装一下,组装后的消息包含发送人和发送的文本内容// {"from": "zhang", "text": "hello"}JSONObject jsonObject = new JSONObject();jsonObject.set("from", username);jsonObject.set("text", text);this.sendMessage(jsonObject.toString(), toSession);log.info("发送消息成功:[{}]成功给[{}]发送消息[{}]", username, toUsername, jsonObject);} else {log.info("发送失败,未找到用户[{}]的会话", toUsername);}}/*** 发送错误时** @param session* @param error*/@OnErrorpublic void onError(Session session, Throwable error) {log.error("发生错误, sessionId = {}", session.getId());error.printStackTrace();}/*** 服务端发送消息给客户端** @param message* @param toSession*/private void sendMessage(String message, Session toSession) {try {toSession.getBasicRemote().sendText(message);log.info("成功发送[{}]消息给客户端(sessionId={})", message, toSession.getId());} catch (Exception e) {log.error("发送消息失败", e);}}/*** 服务端发送消息给所有客户端** @param message*/private void sendMsg2All(String message) {try {for (Session session : SESSION_MAP.values()) {try {session.getBasicRemote().sendText(message);log.info("服务端成功发送消息[{}]给客户端[{}]", message, session.getId());} catch (Exception e) {log.error("发送消息失败", e);}}} catch (Exception e) {log.error("发送消息失败", e);}}
}

源代码

完整代码:https://gitee.com/engureguo/websocket-demo

参考

https://blog.csdn.net/xqnode/article/details/124360506

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

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

相关文章

解决: 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常。

1、在Chrome地址栏中输入:chrome://net-internals/#hsts; 进入Domain Sercurity Policy界面。 2、在下图中输入二级域名查询是否使用了强制 HTTPS 请求。3、如果有查询结果&#xff0c;则在最下方的delete栏处&#xff0c;删除该域名的信息 4、再次查询&#xff0c;如下图所示&…

Win11系统电脑浏览器打开页面时显示无法访问此页面

无法获取域名的正确IP地址&#xff0c;由此可见网页无法打开的问题很可能出现在DNS设置上了。打开网页出现“无法访问此页面”&#xff0c;可以通过更改DNS服务器地址解决该问题 1、首先打开系统设置 2.【控制面板】-【网络和Internet】-【网络连接】 3.选择使用下面的DNS服务…

浏览器无法访问此网站该如何处理?

打开浏览器搜索内容&#xff0c;发现浏览器网页无法显示&#xff0c;出现了如下的提示。然后本篇文章主要写给浏览器无法使用的人提供一些解决办法。 谷歌浏览器&#xff08;老版本&#xff09; 打开谷歌浏览器&#xff0c;首先进入浏览器点击右上方三个点&#xff0c;找到“…

无法访问此网站网址为 http://localhost:6000/xxx 的网页可能暂时无法连接,或者它已永久性地移动到了新网址。 ERR_UNSAFE_POR

无法访问此网站 问题: 自己写的WEB服务, 端口6000在浏览器上怎么请求都无法访问此网站, 如下图: 在谷歌上访问: 在火狐上访问: 但是发现一个问题就是在Postman和IE里边测试是可以用的 原因&#xff1a;就是因为浏览器出于安全考虑, 会设置非安全不能访问的端口。 所以在平常开…

(2022年12月)解决: 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常

1、问题描述&#xff1a; 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的&#xff0c;因此&#xff0c;此网页稍后可能会恢复正常 2、概念解释&#xff1a; HSTS&#xff1a;HSTS 是 HTTP 严格传输安全&#xff08;HTTP Strict Transport Security&…

谷歌浏览器提示,您目前无法访问,因为此网站使用了HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复

在本地建网站时&#xff0c;使用本地hosts转向域名&#xff0c;使用谷歌浏览器访问时出现了&#xff0c;您目前无法访问&#xff0c;因为此网站使用了HSTS。网络错误和攻击通常是暂时的&#xff0c;因此&#xff0c;此网页稍后可能会恢复。 解决方法&#xff1a; 1.在谷歌浏览…

Chrome浏览器出现无法访问此网站/无法显示此网页的错误,怎么解决?

出现"无法访问此网站"或"无法显示此网页"的错误&#xff0c;有很多原因会导致这个问题发生&#xff0c;下面说明如何解决这个问题。 升级Chrome到最新版本&#xff0c;首先确认您的Chrome已经升级到了最新的稳定版&#xff0c;将Chrome升级到最新版本&…

网络连接正常但百度网页打不开显示无法访问此网站解决方案

电脑连接网络正常但百度网页打不开显示无法访问此网站 一、近期博主连接校园网之后打开百度发现无法访问&#xff0c;且显示下面图片中的错误。 二、然后Windows网络诊断发现是DNS没有响应。 三、博主选择重置电脑DNS设置。 四、最后正常访问百度。

电脑网络连接正常,微信、QQ能正常使用,但无法访问网页

电脑网络连接正常&#xff0c;微信、QQ能正常使用&#xff0c;但无法访问网页 问题描述&#xff1a;可能是在上网时动了代理服务器的地址&#xff0c;虽然过后把代理服务器给取消了&#xff0c;但电脑里的IE&#xff0c;360浏览器&#xff0c;Chrome都登不了网页&#xff0c;但…

解决: 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复正常

这里写自定义目录标题 问题&#xff1a;描述&#xff1a;概念解释&#xff1a;解决&#xff1a;网上最多的解决方案实际解决 参考 问题&#xff1a; 您目前无法访问 因为此网站使用了 HSTS。网络错误和攻击通常是暂时的&#xff0c;因此&#xff0c;此网页稍后可能会恢复正常 …

开源 Llama 2 春风得意、ChatGPT 惨遭嫌弃,OpenAI 表示不服!

作者 | 曾浩辰 责编 | 唐小引、袁滚滚 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 既开源又免费的 Llama 2 一经发布颇有席卷之势&#xff0c;成了最火爆的开源 ChatGPT 替代&#xff0c;国内外不少开发者及企业都跟风进行模型的研究和商业开发&#xf…

ChatGPT真的懂SAP系统吗,我问ChatGPT如何学习FICO模块

文章目录 目录 文章目录 SAP FICO是什么&#xff1f; 问ChatGPT&#xff0c;如何学习FICO模块 要学习FICO模块&#xff0c;需要哪些基础知识 在学习SAP系统的FICO模块时&#xff0c;有哪些需要注意 SAP FICO是什么&#xff1f; FICO是SAP中的财务模块&#xff0c;一块是…

数字化税务革命:低代码助力打造纳税新时代

前言 税务办公数字化已成为当代企业发展的必然趋势。在数智时代背景下&#xff0c;企业需要将传统的纸质文档和繁琐的人工操作转变为高效便捷的数字化流程。随着数字化转型的推进&#xff0c;税务机关面临着如何实现高效率、高质量的税务办公的挑战。 势在必行的数字化变革 数字…

chatgpt赋能python:Python闰年统计:计算机程序自动化处理问题

Python闰年统计&#xff1a;计算机程序自动化处理问题 Python是一种高级编程语言&#xff0c;通过下列函数如何计算闰年。 def isLeapYear(year):if (year % 4) 0:if (year % 100) 0:if (year % 400) 0:return Trueelse:return Falseelse:return Trueelse:return False该函…

适合个人请假的理由

现在这年头请假难&#xff0c;请病假吧到是容易请到&#xff0c;但是自己好好的请个病假像是骂自己去生病一样&#xff0c;请病假还要医院证明。所以请病假不妥&#xff0c;除非真生病&#xff0c;否则建议别请病假。 1、自我诅咒版理由&#xff1a;生病&#xff0c;比如过敏、…

上班族请假理由大全

导读&#xff1a;上班族是命苦的一族&#xff0c;想请个假去半点私事还得需要请假&#xff0c;可要是总请假那就需要合理的请假理由配上请假医院证明完美&#xff0c;一般上班族请假理由分为婚假、丧假、产假、事假、病假这五大类&#xff0c;可仔细一想&#xff0c;也就只有事…

HTB Mailroom WriteUp

Mailroom Namp ┌──(root&#x1f480;kali)-[~] └─# nmap -A 10.10.11.209 Starting Nmap 7.93 ( https://nmap.org ) at 2023-04-16 22:27 EDT Nmap scan report for 10.10.11.209 Host is up (0.093s latency). Not shown: 998 closed tcp ports (reset) PORT STATE …

计算机二级请假条,请假条的范文标准版

请假条的范文标准版 因为请假的原因&#xff0c;请假条分为请病假和请事假两种。下面是小编为大家搜集了请假条范文标准版&#xff0c;供大家参考借鉴。 请假条范文标准版(一) 尊敬的_______________&#xff1a; 您好!我是余坊中心校的教师_________&#xff0c;因为_________…

如何在电脑上制作请假条表格_单位请假条表格

单位请假条表格 尊敬的领导&#xff1a; 您好! 我是 部(门)的 (姓名)&#xff0c;因为 (原因)&#xff0c;需要请假(时间)从 年 月 日 到 年 月 日 &#xff0c;共( )天假&#xff0c;请假期间有效联系方式&#xff1a; 。 恳请领导批准&#xff0c;谢谢! 综合部负责人(签字)&a…

html5请假页面,请假模版。.html

&#xfeff;请假模版。 $axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; }; $axure.utils.getOtherPath function() { return resources/Other.html; }; $axure.utils.getReloadPath function() { return resources/reload.htm…