SpringBoot使⽤WebSocket打造室(基于注解)
推荐WebSocket的三⼤理由:
1、采⽤全双⼯通信,摆脱传统HTTP轮询的窘境。
2、采⽤W3C国际标准,完美⽀持HTML5。
3、简单⾼效,容易上⼿。
学习⽬标
快速学会通过WebSocket编写简单聊天功能。
快速查阅
专题阅读:《SpringBoot 布道系列》
源码下载:SpringBoot-WebSocket-Chat
温馨提⽰:
1、WebSocket是HTML5开始提供的⼀种在单个 TCP 连接上进⾏全双⼯通讯的协议。在WebSocket API中,浏览器和服务器只需要做⼀个握⼿的动作,然后,浏览器和服务器之间就形成了⼀条快速通道。两者之间就直接可以数据互相传送。
2、浏览器通过 JavaScript 向服务器发出建⽴ WebSocket 连接的请求,连接建⽴以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。
3、当你获取 Web Socket 连接后,你可以通过 send() ⽅法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。
使⽤教程
⼀、打造 WebSocket 聊天客户端
温馨提⽰:得益于W3C国际标准的实现,我们在浏览器JS就能直接创建WebSocket对象,再通过简单的回调函数就能完成WebSocket客户端的编写,⾮常简单!接下来让我们⼀探究竟。
使⽤说明:
使⽤步骤:1、获取WebSocket客户端对象。
例如: var webSocket = new WebSocket(url);
使⽤步骤:2、获取WebSocket回调函数。
例如:ssage = function (event) {console.log(‘WebSocket收到消息:’ + event.data);
事件类型 WebSocket回调函数 事件描述
pen 当打开连接后触发
ssage 当客户端接收服务端数据时触发
r 当通信异常时触发
lose 当连接关闭时触发
使⽤步骤:3、发送消息给服务端
例如:webSokcet.send(jsonStr) 结合实际场景 本案例采⽤JSON字符串进⾏消息通信。
具体实现:
下⾯是本案例的客户端实现的JS代码,附带详细注释。
========================================================================
⼆、打造 WebSocket 聊天服务端
温馨提⽰:得益于SpringBoot提供的⾃动配置,我们只需要通过简单注解@ServerEndpoint就就能创建WebSocket服务端,再通过简单的回调函数就能完成WebSocket服务端的编写,⽐起客户端的使⽤同样⾮常简单!
使⽤说明:
⾸先在POM⽂件引⼊spring-boot-starter-websocket 、thymeleaf 、FastJson等依赖。
使⽤步骤:1、开启WebSocket服务端的⾃动注册。
【这⾥需要特别提醒:ServerEndpointExporter 是由Spring官⽅提供的标准实现,⽤于扫描ServerEndpointConfig配置类和
@ServerEndpoint注解实例。使⽤规则也很简单:1.如果使⽤默认的嵌⼊式容器 ⽐如Tomcat 则必须⼿
⼯在上下⽂提供ServerEndpointExporter。2. 如果使⽤外部容器部署war包,则不要提供提供ServerEndpointExporter,因为此时SpringBoot默认将扫描服务端的⾏为交给外部容器处理。】
@Configuration
public class WebSocketConfig {
@Bean
public 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.更新在线⼈数
*/
@OnOpen
public void onOpen(Session session) {
onlineSessions.Id(), session);
sendMessageToAll(Message.jsonStr(Message.ENTER, "", "", onlineSessions.size()));
}
/**
* 当客户端发送消息:1.获取它的⽤户名和消息 2.发送消息给所有⼈
* <p>
* PS: 这⾥约定传递的消息为JSON字符串⽅便传递更多参数!
*/
@OnMessage
public void onMessage(Session session, String jsonStr) {
Message message = JSON.parseObject(jsonStr, Message.class);
sendMessageToAll(Message.jsonStr(Message.SPEAK, Username(), Msg(), onlineSessions.size())); }
/**
* 当关闭连接:1.移除会话对象 2.更新在线⼈数
*/
@OnClose
public void onClose(Session session) {
sendMessageToAll(Message.jsonStr(Message.QUIT, "", "下线了!", onlineSessions.size()));
}
/**
* 当通信发⽣异常:打印错误⽇志
*/
@OnError
public void onError(Session session, Throwable error) {
error.printStackTrace();
}
/**
* 公共⽅法:发送信息给所有⼈
*/
private static void sendMessageToAll(String msg) {
onlineSessions.forEach((id, session) -> {
try {
} 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) {
JSONString(new Message(type, username, msg, onlineTotal));
}
}
三、WebSocket案例的视频演⽰
1、源码下载
⾄此,我们完成了客户端和服务端的编码,由于篇幅有限,本教程的页⾯代码并未完整贴上,想要完整的体验效果请在Github下载源码。传送门:
2、视频演⽰
上⾯⼀顿操作猛如虎,实际到底是啥样⼦呢,接下来由哈⼠奇童鞋为我们演⽰最终版的案例:
ws-gif.gif
四、全⽂总结
1、使⽤WebSocket⽤于实时双向通讯的场景,常见的如聊天室、跨系统消息推送等。
2、创建WebSocket客户端使⽤JS内置对象+回调函数+send⽅法发送消息。
3、创建WebSocket服务端使⽤注解声明实例+使⽤注解声明回调⽅法+使⽤Session发送消息。
本⽂是装载、⾃⼰看了这个⽂章都学习到很多的东西,⾥⾯的程序下载下来就能够跑起来希望对⼤家有帮助,也感谢作者能编写怎么好的⽂章。
作者:yizhiwazi
链接:
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论