让我为你详细介绍一下“Spring Boot WebSocket简单入门示例”的攻略。
简介
Spring Boot WebSocket使得在应用程序中添加实时数据交互功能变得非常容易。WebSocket是一种在单个TCP连接上全双工通信协议,它使得服务器端和客户端之间可以双向通信。下面,我们将演示如何在Spring Boot应用程序中使用WebSocket,为客户端提供Web实时通信功能。
搭建Spring Boot WebSocket环境
在开始之前,请确保你已经安装好Java和Spring Boot环境。如果你还没有,建议先完成相关环境的安装。
添加Spring Boot WebSocket依赖
WebSocket在Spring Boot中已经得到了良好的支持,所以我们只需要在Maven中添加相应的依赖即可。在pom.xml
文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
创建WebSocket配置类
在Spring Boot中,我们可以通过自定义WebSocket配置类来配置WebSocket。我们可以在配置类中使用@EnableWebSocket
注解启用WebSocket,并实现WebSocketConfigurer
接口来配置WebSocket相关的信息。
在示例代码中,我们创建一个WebSocketConfig
类,代码如下:
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new WebSocketHandler(), "/websocket");
}
}
可以看到,我们通过@EnableWebSocket
注解启用WebSocket,并在registerWebSocketHandlers
方法中注册了一个名为WebSocketHandler
的WebSocket处理器,同时设置了WebSocket的URL路径为/websocket
。
创建WebSocket处理器类
在WebSocket配置类中,我们注册了一个WebSocket处理器,那么我们就需要定义该处理器的具体实现。在示例代码中,我们创建了一个WebSocketHandler
类作为WebSocket处理器,代码如下:
public class WebSocketHandler extends TextWebSocketHandler {
private static final Logger logger = LoggerFactory.getLogger(WebSocketHandler.class);
private final Map<WebSocketSession, String> sessionMap = new ConcurrentHashMap<>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
logger.info("WebSocket连接已建立");
sessionMap.put(session, session.getId());
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
logger.info("接收到消息:" + message.getPayload());
session.sendMessage(new TextMessage("服务器已接收到您的消息"));
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
logger.info("WebSocket连接已关闭");
sessionMap.remove(session);
}
}
在该处理器类中,我们继承了TextWebSocketHandler
类,重写了三个关键方法:
-
afterConnectionEstablished
方法,在WebSocket连接建立后执行,我们在该方法中保存了WebSocketSession。 -
handleTextMessage
方法,在WebSocket收到消息后执行,我们在该方法中处理了客户端发送的消息,并向客户端回复一条消息。 -
afterConnectionClosed
方法,在WebSocket连接关闭后执行,我们在该方法中从保存WebSocketSession的Map中删除该Session。
到目前为止,我们已经完成了Spring Boot WebSocket的配置和WebSocket处理器的实现,下面我们将演示两个简单的示例。
示例1:使用JavaScript客户端向服务器发送WebSocket请求并接收数据
为了演示如何在Spring Boot WebSocket应用程序中使用JavaScript客户端向服务器发送WebSocket请求并接收数据,我们创建了一个前端网页,使用JavaScript代码向Spring Boot服务器发送WebSocket请求,代码如下:
<!DOCTYPE html>
<html>
<head>
<title>Spring Boot WebSocket示例 - JavaScript客户端</title>
<script src="http://cdn.staticfile.org/jquery/3.4.1/jquery.min.js"></script>
<script src="/webjars/sockjs-client/1.0.2/sockjs.min.js"></script>
<script src="/webjars/stomp-websocket/2.3.3/stomp.min.js"></script>
</head>
<body>
<h1>Spring Boot WebSocket示例 - JavaScript客户端</h1>
<form>
<textarea id="message"></textarea>
<button type="button" onclick="sendMessage()">发送</button>
</form>
<p>
<div id="response"></div>
</p>
</body>
<script>
var stompClient = null;
function setConnected(connected) {
$("#response").html("");
$("#connect").prop("disabled", connected);
$("#disconnect").prop("disabled", !connected);
if (connected) {
$("#response").append("<span>WebSocket连接已建立</span><br>");
} else {
$("#response").append("<span>WebSocket连接已关闭</span><br>");
}
}
function connect() {
var socket = new SockJS('/websocket');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
stompClient.subscribe('/topic/response', function(response) {
showMessage(JSON.parse(response.body));
});
});
}
function disconnect() {
if (stompClient != null) {
stompClient.disconnect();
}
setConnected(false);
}
function sendMessage() {
stompClient.send("/app/message", {}, JSON.stringify({'content': $("#message").val()}));
}
function showMessage(message) {
$("#response").append("<span>" + message.content + "</span><br>");
}
$(function() {
connect();
$(window).unload(function() {
disconnect();
});
});
</script>
</html>
在该代码中,我们使用了SockJS和STOMP协议,SockJS是一个WebSocket协议的兼容层,使得浏览器可以通过HTTP协议和服务器建立WebSocket连接,而STOMP协议是一个简单的、基于文本的协议,提供了一种统一的方式来处理WebSocket消息。
该代码所实现的是一个简单的聊天室功能,当用户在文本框中输入消息并点击“发送”按钮后,该消息将通过WebSocket发送到服务器,并在WebSocket连接成功后自动订阅/topic/response主题,以接收服务器的响应。在服务器收到WebSocket消息并处理完毕后,将响应发送到/topic/response主题,JavaScript客户端会自动接收到该响应并显示在页面上。
示例2:使用Java客户端向服务器发送WebSocket请求并接收数据
为了演示如何在Spring Boot WebSocket应用程序中使用Java客户端向服务器发送WebSocket请求并接收数据,我们创建了一个Java类,使用Java代码向Spring Boot服务器发送WebSocket请求,代码如下:
public class WebSocketClient {
private StompSession stompSession;
private final Logger logger = LoggerFactory.getLogger(WebSocketClient.class);
public void connect() {
WebSocketClientTransport transport = new WebSocketClientTransport(new StandardWebSocketClient());
SockJsClient sockJsClient = new SockJsClient(Collections.singletonList(transport));
StompSessionHandler sessionHandler = new MyStompSessionHandler();
StompHeaders headers = new StompHeaders();
headers.set("Authorization", "Bearer " + "your-auth-token");
stompSession = sockJsClient.connect("/websocket", headers, sessionHandler).get();
logger.info("WebSocket连接已建立");
}
public void disconnect() {
stompSession.disconnect();
logger.info("WebSocket连接已关闭");
}
public void sendMessage(String message) {
stompSession.send("/app/message", message);
}
class MyStompSessionHandler extends StompSessionHandlerAdapter {
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
session.subscribe("/topic/response", new StompFrameHandler() {
@Override
public Type getPayloadType(StompHeaders headers) {
return String.class;
}
@Override
public void handleFrame(StompHeaders headers, Object payload) {
logger.info("接收到消息:" + payload);
}
});
}
}
}
在该代码中,我们使用了SockJS和STOMP协议的Java客户端实现,该客户端可以连接到Spring Boot服务器的WebSocket服务,并订阅/topic/response主题,以接收来自服务器的响应。在应用程序中,我们使用了一个WebSocketClient类,该类实现了连接、断开连接、发送消息的功能。同时,我们也实现了一个StompSessionHandler类,在WebSocket连接建立后自动订阅/topic/response主题,以接收服务器的响应。当收到来自服务器的响应后,我们就可以在控制台中输出该响应。
到这里,我们已经完成了两个WebSocket示例。在实际开发中,WebSocket的应用场景非常广泛。比如有在线直播、在线游戏、自动化监控等领域,都可以使用WebSocket实现实时数据通信。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot websocket简单入门示例 - Python技术站