点击上方“好好学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。

  1. 如果使用外部容器部署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、视频演示

上面一顿操作猛如虎,实际到底是啥样子呢,接下来由哈士奇童鞋为我们演示最终版的在线聊天案例:

image

四、全文总结

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打造在线聊天室(基于注解)相关推荐

  1. SpringBoot与webSocket实现在线聊天室——实现私聊+群聊+聊天记录保存

    SpringBoot与webSocket实现在线聊天室--实现私聊+群聊+聊天记录保存 引用参考:原文章地址:https://blog.csdn.net/qq_41463655/article/det ...

  2. springboot+websocket构建在线聊天室(群聊+单聊)

    系列导读: 1.springboot+websocket构建在线聊天室(群聊+单聊) 2.Spring Boot WebSocket:单聊(实现思路) 3.Websocket Stomp+Rabbit ...

  3. springboot -- 整合websocket 实现在线聊天

    项目demo: 链接:https://pan.baidu.com/s/1xZtU-Rqc58m0-v397OW3hQ 提取码:01pt 复制这段内容后打开百度网盘手机App,操作更方便哦 websoc ...

  4. php+websocket实现在线聊天室(一)

    聊天室最终实现版:https://www.sinight.site/chatroom 可以自己多开几个窗口体验 前言:WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的 ...

  5. 嘿从零开始基于SpringBoot 打造在线聊天室(4.4W字最长博文)

    文章目录 前言 效果 主页面 消息提示 聊天页面 登录注册 前端 项目构建 依赖 项目结构 登录注册 验证码部分 登录页面 注册页面 主页面 流程 websocket loadmessage 消息发送 ...

  6. .NET Core 实现基于Websocket的在线聊天室

    什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后 ...

  7. websocket一直无法链接_.NET Core 实现基于Websocket的在线聊天室

    什么是Websocket 我们在传统的客户端程序要实现实时双工通讯第一想到的技术就是socket通讯,但是在web体系是用不了socket通讯技术的,因为http被设计成无状态,每次跟服务器通讯完成后 ...

  8. 基于WebSocket的在线聊天室

    1.什么是WebSocket HTML5开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议.它基于TCP传输协议,并复用HTTP的握手通道.WebSocket是一种通信协议,可在单个 ...

  9. SpringBoot集成WebSocket实现在线聊天

    文章目录 前言 1.WebSocket引入 2.环境搭配 2.1.工程创建 2.2.依赖导入 2.3.配置类 3.具体实现 3.1.前置知识 3.2.数据封装 3.3.思路分析 3.4.服务构建 3. ...

最新文章

  1. Android常用的几种资源
  2. jzoj4025-找回密码【后缀自动机】
  3. Android Handler的使用方法
  4. c语言fgets函数的用法
  5. 2020诺奖预测出炉!“引文桂冠”奖今日公布,华人学者戴宏杰入选
  6. 为什么每个线程都需要创建一个栈?
  7. 协同过滤算法_基于Mahout的协同过滤推荐算法
  8. 《统计学习方法》读书笔记
  9. 拓端tecdat|R语言利用基线协变量提高随机对照试验的效率
  10. mysql 5.5 字符集_mysql 5.5字符集问题
  11. 大众奥迪车 UDS协议ECU的诊断
  12. 前端和python哪个工资高_前端和后端哪个工资高
  13. 利用保利威视实现教育视频预览和购买
  14. Windows徽标键(WinKey)的屏蔽和恢复
  15. php手册3.1,ThinkPHP3.1手册
  16. 51822 proximity
  17. 下列各排序法中,最坏情况下的时间复杂度最低的是(**C** )A.希尔排序 B.快速排序 C.堆排序 D.冒泡排序
  18. 春分、冬至、黄道、赤道
  19. 如何运行linux中的vi,如何在linux中vi使用方法
  20. 零和博弈、正和博弈和负和博弈:

热门文章

  1. 获得主窗口句柄AfxGetApp()-m_pMainWnd
  2. RDA8955中碰到的问题
  3. Day04-经典卷积神经网络解读
  4. python 语言教程(3)变量之字典
  5. HMAC(1)消息认证码MAC算法
  6. Hgame 2022 Answer‘s Windows
  7. 设计模式--单例(Singleton)模式
  8. 【django】配置redis数据库【4】
  9. 【django】全局上下文
  10. MySQL—函数的使用