一、前言
在现在的Web应用开发中,实时性的需求越来越高,一种常见的技术就是WebSocket。WebSocket是HTML5中新增的协议,可以实现客户端和服务端的全双工通信,而不需要像HTTP那样每次请求后都要断开连接。
Spring Boot是一个基于Spring框架的Web应用开发框架,可以构建独立的、生产级别的Spring应用程序,简化了Spring应用开发的过程。
本文将讲解如何使用Spring Boot和WebSocket实现并发抢红包功能。
二、实现步骤
- 环境配置
首先要确保已安装Java和Maven,并添加至系统环境变量中。在控制台输入以下命令检查:
java -version
mvn -version
- 创建Spring Boot项目
在IDEA中创建一个Maven项目,使用默认配置,等待自动下载依赖包完成。在项目的pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
- 配置WebSocket
在Spring Boot中,WebSocket的配置比较简单,只需要一个配置类和一个Handler即可。在项目中创建一个WebSocketConfig类,添加如下内容:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new WebSocketHandler(), "/websocket").addInterceptors(new WebSocketInterceptor());
}
}
创建WebSocketHandler类,继承自TextWebSocketHandler,处理客户端和服务端的WebSocket通讯:
public class WebSocketHandler extends TextWebSocketHandler {
private static final ConcurrentMap<String, WebSocketSession> SESSIONS = new ConcurrentHashMap<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
SESSIONS.put(session.getId(), session);
System.out.println("新用户连接:" + session.getId());
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
SESSIONS.remove(session.getId());
System.out.println("用户断开连接:" + session.getId());
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
String payload = message.getPayload();
System.out.println("收到消息:" + payload);
if (payload.startsWith("grab_")) {
String[] arr = payload.split("_");
String userId = arr[1];
sendMessage(userId, "恭喜你,抢到一个红包!");
} else {
session.sendMessage(new TextMessage("服务器返回:" + payload.toUpperCase()));
}
}
public void sendMessage(String userId, String message) throws IOException {
WebSocketSession session = SESSIONS.get(userId);
if (session.isOpen()) {
session.sendMessage(new TextMessage(message));
}
}
}
WebSocketInterceptor类,实现WebSocketHandlerInterceptor,处理用户连接时的拦截和校验:
public class WebSocketInterceptor implements WebSocketHandlerInterceptor {
@Override
public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
System.out.println("监听到连接:" + request.getURI());
String userId = request.getURI().getQuery().substring(7);
if (userId == null || userId.isEmpty()) {
return false;
} else {
attributes.put("userId", userId);
return true;
}
}
@Override
public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception exception) {
}
}
- 编写页面代码
在项目中创建一个HTML页面,添加如下内容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script>
<script>
var socket;
var userId;
function connect() {
userId = $("#userId").val();
socket = new WebSocket("ws://localhost:8080/websocket?userId=" + userId);
socket.onopen = function () {
console.log("连接成功");
}
socket.onclose = function () {
console.log("断开连接");
}
socket.onmessage = function (event) {
console.log(event.data);
}
}
function sendMsg() {
var content = $("#content").val();
socket.send(content);
console.log("发送消息:" + content);
$("#content").val("");
}
function grab() {
socket.send("grab_" + userId);
console.log("立即抢红包");
}
</script>
</head>
<body>
<h1>WebSocket</h1>
<p>
用户ID:<input type="text" id="userId">
<button onclick="connect()">连接</button>
</p>
<p>
发送消息:<input type="text" id="content">
<button onclick="sendMsg()">发送</button>
</p>
<p>
<button onclick="grab()">立即抢红包</button>
</p>
</body>
</html>
在页面中使用JavaScript创建一个WebSocket连接,接收和发送消息,还可用于抢红包操作。
- 运行项目
在IDEA中运行Spring Boot项目,浏览器访问页面,输入用户ID,点击连接,即完成了WebSocket的连接。在控制台可以看到新用户连接的消息,输入要发送的消息后点击发送,即可在控制台看到收到的消息。若想执行抢红包操作,点击立即抢红包按钮即可。
- 示例
以下是抢红包实现的示例代码:
function grab() {
socket.send("grab_" + userId);
console.log("立即抢红包");
}
if (payload.startsWith("grab_")) {
String[] arr = payload.split("_");
String userId = arr[1];
sendMessage(userId, "恭喜你,抢到一个红包!");
}
以上代码,用户点击立即抢红包按钮后,会发送一个以“grab_”开始的文本消息,服务端将其作为抢红包操作进行处理,如果抢到了红包,就会发送一个恭喜你的消息到对应用户的客户端。
除此之外,如果要实现其他功能,只需在handleTextMessage方法中添加相应逻辑即可。
- 总结
本文讲解了如何使用Spring Boot和WebSocket实现并发抢红包功能,介绍了WebSocket的简单配置和功能实现。
WebSocket具有双向通信、高并发、实时性等特点,可以应用于很多场景,如在线聊天、直播互动、在线游戏等。相信本文对您学习WebSocket技术有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot+websocket实现并发抢红包功能 - Python技术站