Spring Boot整合WebSocket实现实时通信
实时通信在现代Web应用中扮演着越来越重要的角色,无论是在线聊天、股票价格更新还是实时通知,WebSocket都是实现这些功能的关键技术之一。Spring Boot作为一个简化企业级应用开发的框架,其对WebSocket的支持也非常友好。本文将详细介绍如何在Spring Boot中整合WebSocket,实现一个简单的实时通信服务。
引言
在 Spring Boot 中使用 WebSocket 有 2 种方式。第 1 种是使用由 Jakarta EE 规范提供的 Api,也就是 jakarta.websocket
包下的接口。第 2 种是使用 spring 提供的支持,也就是 spring-websocket
模块。前者是一种独立于框架的技术规范,而后者是 Spring 生态系统的一部分,可以与其他 Spring 模块(如 Spring MVC、Spring Security)无缝集成,共享其配置和功能。因为是进行学习进行使用webSocket所以进行选择第一种方式来进行实现.
本文将使用第 1 种方式,也就是使用 jakarta.websocket
来开发 WebSocket 应用。
1. 环境准备
- JDK 1.8 或更高版本
- Spring Boot 2.x
- IntelliJ IDEA / Eclipse (或其他Java IDE)
- Maven 或 Gradle 作为构建工具
- springboot版本:3.2.5
2. 添加依赖
打开pom.xml
文件,并添加WebSocket相关的依赖.
<!--实时通信webSocket依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
3. 开发 ServerEndpoint 端点
ServerEndpoint
是一个注解,用于定义WebSocket服务器端点。使用这个注解,你可以指定WebSocket的URL模式,以便客户端能够连接到你的服务.
package com.fs.webSocket;
import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
// 这个和Controller的作用是类似的
@ServerEndpoint(value = "/websocket") // 此类是一个webSocket端点 服务端,监听/websocket的路径
public class MyServerEndpoint {
// 定义一个Session对象
private Session session;
// 客户端与服务端建立连接触发
@OnOpen
public void onOpen(Session session) {
// 保存session
this.session = session;
System.out.println("websocket连接成功");
}
// 客户端向服务端发送消息
@OnMessage
public void onMessage(String message) {
System.out.println("收到客户端消息:" + message);
}
// 客户端服务端连接异常触发
@OnError
public void onError(Session session, Throwable error) {
System.out.println("websocket连接异常");
}
// 客户端与服务端断开连接触发
@OnClose
public void onClose(Session session) {
System.out.println("websocket连接关闭");
}
}
注意:所有事件方法,都支持使用 Session
作为参数,表示当前连接参数。但是为了更加方便,我们在 @OnOpen
事件中直接把 Session
存储到了当前对象中,可以在任意方法中使用 this
访问。服务器会为每个连接创建一个端点对象,所以这是线程安全的。
4. 配置webSocket
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
ServerEndpointExporter exporter = new ServerEndpointExporter();
exporter.setAnnotatedEndpointClasses(MyServerEndpoint.class); // 进行手动注册webSocket端点
return exporter;
}
}
当然也可以在MyServerEndpoint这个类上面进行添加 @Component注解,Spring 自动扫描,这样的话不需要手动调用 setAnnotatedEndpointClasses
方法进行注册。
5.前端集成测试
在资源文件夹resorces/static/index.html中书写一个简单的前端websocket进行连接到服务器通信,
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WebSocket</title>
</head>
<body>
<script type="text/javascript">
let websocket = new WebSocket("ws://localhost:8080/websocket");
// 连接断开
websocket.onclose = e => {
console.log(`连接关闭: code=${e.code}, reason=${e.reason}`)
}
// 收到消息
websocket.onmessage = e => {
console.log(`收到消息:${e.data}`);
}
// 异常
websocket.onerror = e => {
console.log("连接异常")
console.error(e)
}
// 连接打开
websocket.onopen = e => {
console.log("连接打开");
// 创建连接后,往服务器连续写入3条消息
websocket.send("sprigdoc.cn");
websocket.send("sprigdoc.cn");
websocket.send("sprigdoc.cn");
// 最后发送 bye,由服务器断开连接
websocket.send("bye");
// 也可以由客户端主动断开
// websocket.close();
}
</script>
</body>
</html>
启动应用,打开浏览器(先打开控制台),然后访问 http://localhost:8080/
,查看控制台服务端输出的日志:
websocket连接成功
收到客户端消息:sprigdoc.cn
收到客户端消息:sprigdoc.cn
收到客户端消息:sprigdoc.cn
收到客户端消息:bye
此时代表连接成功!!!
结语
通过以上步骤,我们已经创建了一个简单的Spring Boot WebSocket的连接。展示了如何使用Spring Boot和WebSocket实现实时通信的基础。在实际项目中,你可能需要考虑更多的因素,如安全性、连接管理、广播优化等。文章来源:https://www.toymoban.com/news/detail-860110.html
希望这篇教程能够帮助你开始探索Spring Boot与WebSocket的整合。如果你有任何疑问或建议,请在评论区告诉我。祝你编程愉快!文章来源地址https://www.toymoban.com/news/detail-860110.html
附录
- Spring Boot官方文档: https://docs.spring.io/spring-boot/docs/current/reference/html/websocket.html
- WebSocket协议规范: https://tools.ietf.org/html/rfc6455
到了这里,关于Spring Boot整合WebSocket实现实时通信,前端实时通信,前后端实时通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!