SpringBoot 使用WebSocket打造在线聊天室(基于注解)
点击上方“好好学java”,选择“置顶公众号”
优秀学习资源、干货第一时间送达!
精彩内容
java实战练习项目教程
2018微服务资源springboot、springcloud、docker、dubbo实战等倾心分享
2018年java架构师全套学习教程
最新大数据培训完整视频教程
2018年java最新全套培训学习教程
一、打造 WebSocket 聊天客户端
温馨提示:得益于W3C国际标准的实现,我们在浏览器JS就能直接创建WebSocket对象,再通过简单的回调函数就能完成WebSocket客户端的编写,非常简单!接下来让我们一探究竟。
使用说明
使用步骤:1、获取WebSocket客户端对象。
例如:var webSocket = new WebSocket(url);
使用步骤:2、获取WebSocket回调函数。
例如:webSocket.onmessage = function (event) {console.log('WebSocket收到消息:' + event.data);
事件类型 | WebSocket回调函数 | 事件描述 |
---|---|---|
open | webSocket.onopen | 当打开连接后触发 |
message | webSocket.onmessage | 当客户端接收服务端数据时触发 |
error | webSocket.onerror | 当通信异常时触发 |
close | webSocket.onclose | 当连接关闭时触发 |
使用步骤:3、发送消息给服务端
例如:webSokcet.send(jsonStr)
结合实际场景 本案例采用JSON字符串进行消息通信。
具体实现
下面是本案例在线聊天的客户端实现的JS代码,附带详细注释。
<script>/*** WebSocket客户端** 使用说明:* 1、WebSocket客户端通过回调函数来接收服务端消息。例如:webSocket.onmessage* 2、WebSocket客户端通过send方法来发送消息给服务端。例如:webSocket.send();*/function getWebSocket() {/*** WebSocket客户端 PS:URL开头表示WebSocket协议 中间是域名端口 结尾是服务端映射地址*/var webSocket = new WebSocket('ws://localhost:8080/chat');/*** 当服务端打开连接*/webSocket.onopen = function (event) {console.log('WebSocket打开连接');};/*** 当服务端发来消息:1.广播消息 2.更新在线人数*/webSocket.onmessage = function (event) {console.log('WebSocket收到消息:%c' + event.data, 'color:green');//获取服务端消息var message = JSON.parse(event.data) || {};var $messageContainer = $('.message-container');//喉咙发炎if (message.type === 'SPEAK') {$messageContainer.append('<div class="mdui-card" style="margin: 10px 0;">' +'<div class="mdui-card-primary">' +'<div class="mdui-card-content message-content">' + message.username + ":" + message.msg + '</div>' +'</div></div>');}$('.chat-num').text(message.onlineCount);//防止刷屏var $cards = $messageContainer.children('.mdui-card:visible').toArray();if ($cards.length > 5) {$cards.forEach(function (item, index) {index < $cards.length - 5 && $(item).slideUp('fast');});}};/*** 关闭连接*/webSocket.onclose = function (event) {console.log('WebSocket关闭连接');};/*** 通信失败*/webSocket.onerror = function (event) {console.log('WebSocket发生异常');};return webSocket;}var webSocket = getWebSocket();/*** 通过WebSocket对象发送消息给服务端*/function sendMsgToServer() {var $message = $('#msg');if ($message.val()) {webSocket.send(JSON.stringify({username: $('#username').text(), msg: $message.val()}));$message.val(null);}}/*** 清屏*/function clearMsg(){$(".message-container").empty();}/*** 使用ENTER发送消息*/document.onkeydown = function (event) {var e = event || window.event || arguments.callee.caller.arguments[0];e.keyCode === 13 && sendMsgToServer();};
</script>
二、打造 WebSocket 聊天服务端
温馨提示:得益于SpringBoot提供的自动配置,我们只需要通过简单注解
@ServerEndpoint
就就能创建WebSocket服务端,再通过简单的回调函数就能完成WebSocket服务端的编写,比起客户端的使用同样非常简单!
使用说明:
首先在POM文件引入spring-boot-starter-websocket
、thymeleaf 、FastJson等依赖。
使用步骤:1、开启WebSocket服务端的自动注册。
这里需要特别提醒: ServerEndpointExporter 是由Spring官方提供的标准实现,用于扫描ServerEndpointConfig配置类和@ServerEndpoint注解实例。
使用规则也很简单:
1.如果使用默认的嵌入式容器 比如Tomcat 则必须手工在上下文提供ServerEndpointExporter。
如果使用外部容器部署war包,则不要提供提供ServerEndpointExporter,因为此时SpringBoot默认将扫描服务端的行为交给外部容器处理。
@Configuration
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}
使用步骤:2、创建WebSocket服务端。
核心思路:
① 通过注解
@ServerEndpoint
来声明实例化WebSocket服务端。② 通过注解
@OnOpen、@OnMessage、@OnClose、@OnError
来声明回调函数。
事件类型 | WebSocket服务端注解 | 事件描述 |
---|---|---|
open | @OnOpen | 当打开连接后触发 |
message | @OnMessage | 当客户端接收服务端数据时触发 |
error | @OnClose | 当通信异常时触发 |
close | @OnError | 当连接关闭时触发 |
③ 通过
ConcurrentHashMap
保存全部在线会话对象。
@Component
@ServerEndpoint("/chat")//标记此类为服务端
public class WebSocketChatServer {/*** 全部在线会话 PS: 基于场景考虑 这里使用线程安全的Map存储会话对象。*/private static Map<String, Session> onlineSessions = new ConcurrentHashMap<>();/*** 当客户端打开连接:1.添加会话对象 2.更新在线人数*/@OnOpenpublic void onOpen(Session session) {onlineSessions.put(session.getId(), session);sendMessageToAll(Message.jsonStr(Message.ENTER, "", "", onlineSessions.size()));}/*** 当客户端发送消息:1.获取它的用户名和消息 2.发送消息给所有人* <p>* PS: 这里约定传递的消息为JSON字符串 方便传递更多参数!*/@OnMessagepublic void onMessage(Session session, String jsonStr) {Message message = JSON.parseObject(jsonStr, Message.class);sendMessageToAll(Message.jsonStr(Message.SPEAK, message.getUsername(), message.getMsg(), onlineSessions.size()));}/*** 当关闭连接:1.移除会话对象 2.更新在线人数*/@OnClosepublic void onClose(Session session) {onlineSessions.remove(session.getId());sendMessageToAll(Message.jsonStr(Message.QUIT, "", "下线了!", onlineSessions.size()));}/*** 当通信发生异常:打印错误日志*/@OnErrorpublic void onError(Session session, Throwable error) {error.printStackTrace();}/*** 公共方法:发送信息给所有人*/private static void sendMessageToAll(String msg) {onlineSessions.forEach((id, session) -> {try {session.getBasicRemote().sendText(msg);} catch (IOException e) {e.printStackTrace();}});}}
④ 通过会话对象
javax.websocket.Session
来发消息给客户端。
/*** WebSocket 聊天消息类*/
@AllArgsConstructor
@Data
public class Message {public static final String ENTER = "ENTER";public static final String SPEAK = "SPEAK";public static final String QUIT = "QUIT";private String type;//消息类型private String username; //发送人private String msg; //发送消息private int onlineCount; //在线用户数public static String jsonStr(String type, String username, String msg, int onlineTotal) {return JSON.toJSONString(new Message(type, username, msg, onlineTotal));}![ws-gif.gif](https://upload-images.jianshu.io/upload_images/8069210-c260e9ed6c4defde.gif?imageMogr2/auto-orient/strip)}
三、WebSocket在线聊天案例的视频演示
1、源码下载
至此,我们完成了客户端和服务端的编码,由于篇幅有限,本教程的页面代码并未完整贴上,想要完整的体验效果请在Github下载源码。传送门:https://github.com/yizhiwazi/springboot-socks/tree/master/springboot-websocket-chat
2、视频演示
上面一顿操作猛如虎,实际到底是啥样子呢,接下来由哈士奇童鞋为我们演示最终版的在线聊天案例:
四、全文总结
1、使用WebSocket用于实时双向通讯的场景,常见的如聊天室、跨系统消息推送等。
2、创建WebSocket客户端使用JS内置对象+回调函数+send方法发送消息。
3、创建WebSocket服务端使用注解声明实例+使用注解声明回调方法+使用Session发送消息。
作者:yizhiwazi
出处:https://www.jianshu.com/p/55cfc9fcb69e
推荐阅读
1. 解密微信小程序登录全过程(ssm实现)
2. springmvc入门
3. java高并发容器详情
4. 重温javaweb过滤器filter
附上热门QQ群,存放资源和历史资料,2000容量(低门槛付费群),长按二维码入群
SpringBoot 使用WebSocket打造在线聊天室(基于注解)相关推荐
- SpringBoot与webSocket实现在线聊天室——实现私聊+群聊+聊天记录保存
SpringBoot与webSocket实现在线聊天室--实现私聊+群聊+聊天记录保存 引用参考:原文章地址:https://blog.csdn.net/qq_41463655/article/det ...
- springboot+websocket构建在线聊天室(群聊+单聊)
系列导读: 1.springboot+websocket构建在线聊天室(群聊+单聊) 2.Spring Boot WebSocket:单聊(实现思路) 3.Websocket Stomp+Rabbit ...
- springboot -- 整合websocket 实现在线聊天
项目demo: 链接:https://pan.baidu.com/s/1xZtU-Rqc58m0-v397OW3hQ 提取码:01pt 复制这段内容后打开百度网盘手机App,操作更方便哦 websoc ...
- php+websocket实现在线聊天室(一)
聊天室最终实现版:https://www.sinight.site/chatroom 可以自己多开几个窗口体验 前言:WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的 ...
- 嘿从零开始基于SpringBoot 打造在线聊天室(4.4W字最长博文)
文章目录 前言 效果 主页面 消息提示 聊天页面 登录注册 前端 项目构建 依赖 项目结构 登录注册 验证码部分 登录页面 注册页面 主页面 流程 websocket loadmessage 消息发送 ...
- .NET Core 实现基于Websocket的在线聊天室
什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后 ...
- websocket一直无法链接_.NET Core 实现基于Websocket的在线聊天室
什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后 ...
- 基于WebSocket的在线聊天室
1.什么是WebSocket HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议.它基于TCP传输协议,并复用HTTP的握手通道.WebSocket是一种通信协议,可在单个 ...
- SpringBoot集成WebSocket实现在线聊天
文章目录 前言 1.WebSocket引入 2.环境搭配 2.1.工程创建 2.2.依赖导入 2.3.配置类 3.具体实现 3.1.前置知识 3.2.数据封装 3.3.思路分析 3.4.服务构建 3. ...
最新文章
- Android常用的几种资源
- jzoj4025-找回密码【后缀自动机】
- Android Handler的使用方法
- c语言fgets函数的用法
- 2020诺奖预测出炉!“引文桂冠”奖今日公布,华人学者戴宏杰入选
- 为什么每个线程都需要创建一个栈?
- 协同过滤算法_基于Mahout的协同过滤推荐算法
- 《统计学习方法》读书笔记
- 拓端tecdat|R语言利用基线协变量提高随机对照试验的效率
- mysql 5.5 字符集_mysql 5.5字符集问题
- 大众奥迪车 UDS协议ECU的诊断
- 前端和python哪个工资高_前端和后端哪个工资高
- 利用保利威视实现教育视频预览和购买
- Windows徽标键(WinKey)的屏蔽和恢复
- php手册3.1,ThinkPHP3.1手册
- 51822 proximity
- 下列各排序法中,最坏情况下的时间复杂度最低的是(**C** )A.希尔排序 B.快速排序 C.堆排序 D.冒泡排序
- 春分、冬至、黄道、赤道
- 如何运行linux中的vi,如何在linux中vi使用方法
- 零和博弈、正和博弈和负和博弈: