Spring Websocket 是 Spring 框架中的一个关键组件,专门用于实现 WebSocket 通信。通过@EnableWebSocket
注解,它简化了 WebSocket 的配置和启用过程。利用@ServerEndpoint
注解,开发者可以轻松定义 WebSocket 端点,处理来自客户端的连接和消息。Spring Websocket 支持全双工通信,允许服务器和客户端之间进行实时、双向的数据交换。此外,通过@EnableWebSocketMessageBroker
注解,它还能与 STOMP 消息代理集成,提供更高级的消息传递功能。这些注解的结合使用,为构建响应式和实时的 Web 应用程序提供了强大的支持。
肖哥弹架构 跟大家“弹弹” 框架注解使用,需要代码关注
欢迎 点赞,关注,评论。
关注公号 Solomon 肖哥弹架构获取更多精彩内容
历史热点文章
Spring Websocket 架构图
这是一个高层次的架构图,用于展示 Spring Websocket 组件之间的基本关系。其中还会有更多的组件和配置,例如消息代理、安全配置、错误处理等
客户端 发起 WebSocket 请求到 WebSocket 服务器。
WebSocket 服务器 可以是一个嵌入的服务器,如 Tomcat 或 Netty,它处理 WebSocket 请求。
ServerEndpointExporter 用于自动注册使用 @ServerEndpoint
注解的类。
WebSocketConfigurer 允许自定义 WebSocket 配置,如注册额外的 WebSocket 处理器或拦截器。
WebSocketHandlerRegistry 用于注册 WebSocket 处理器和它们的 URL 路径。
@ServerEndpoint 定义了 WebSocket 服务器端点,它是客户端连接的入口点。
WebSocketHandler 是一个接口,用于处理 WebSocket 生命周期事件。
TextWebSocketHandler 和 BinaryWebSocketHandler 分别用于处理文本和二进制消息。
@OnOpen, @OnMessage, @OnClose, @OnError 用于标记处理 WebSocket 连接的不同阶段的方法。
1. 配置和启用注解
@EnableWebSocket
@EnableWebSocket
注解用于 Spring 配置类上,启用基于@ServerEndpoint
的简单 WebSocket 支持。
无特定属性。
@Configuration
@EnableWebSocket
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
复制代码
@EnableWebSocketMessageBroker
@EnableWebSocketMessageBroker
注解用于 Spring 配置类上,启用 STOMP 协议支持和消息代理功能。
无特定属性。
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketMessageBrokerConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic", "/queue");
registry.setApplicationDestinationPrefixes("/app");
}
}
复制代码
2. 定义 WebSocket 端点
@ServerEndpoint
@ServerEndpoint
注解用于类上,定义一个 WebSocket 服务器端点,指定客户端连接的 URL 路径。
@ServerEndpoint(value = "/ws/notifications", configurator = MyConfigurator.class)
public class NotificationEndpoint {
@OnOpen
public void onOpen(Session session) {
// 处理新连接
}
@OnMessage
public void onMessage(Session session, String message) {
// 处理接收到的消息
}
@OnClose
public void onClose(Session session) {
// 处理连接关闭
}
@OnError
public void onError(Session session, Throwable error) {
// 处理连接中的错误
}
}
public class MyConfigurator implements ServerEndpointConfigurator {
// 自定义配置
}
复制代码
3. 处理 WebSocket 生命周期事件
@OnOpen
@OnOpen
注解用于方法上,当 WebSocket 连接打开时触发。
无特定属性。
public class NotificationEndpoint {
@OnOpen
public void onOpen(Session session) {
// 可以记录日志、初始化资源或发送欢迎消息
}
}
复制代码
@OnClose
@OnClose
注解用于方法上,当 WebSocket 连接关闭时触发。
无特定属性。
public class NotificationEndpoint {
@OnClose
public void onClose(Session session) {
// 可以记录日志、清理资源
}
}
复制代码
@OnError
@OnError
注解用于方法上,当 WebSocket 连接发生错误时触发。
无特定属性。
public class NotificationEndpoint {
@OnError
public void onError(Session session, Throwable error) {
// 可以记录错误日志、执行错误恢复操作
}
}
复制代码
4. 接收和发送消息
@OnMessage
public class NotificationEndpoint {
@OnMessage
public void onMessage(Session session, String message) {
// 处理接收到的文本消息
}
@OnMessage
public void onMessage(Session session, byte[] data) {
// 处理接收到的二进制消息
}
// 假设有一个自定义的消息类
@OnMessage
public void onMessage(Session session, MyCustomMessage message) {
// 处理接收到的自定义对象消息
}
}
复制代码
5、综合性的应用案例
1. Spring Boot 启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ChatApplication {
public static void main(String[] args) {
SpringApplication.run(ChatApplication.class, args);
}
}
复制代码
2. WebSocket 配置类
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.*;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatEndpoint(), "/chat")
.setAllowedOrigins("*")
.withSockJS();
}
@Bean
public ChatEndpoint chatEndpoint() {
return new ChatEndpoint();
}
}
复制代码
3. WebSocket 服务器端点
import org.springframework.web.socket.*;
import org.springframework.stereotype.Component;
@Component
@ServerEndpoint("/chat")
public class ChatEndpoint {
private final ChatService chatService;
@Autowired
public ChatEndpoint(ChatService chatService) {
this.chatService = chatService;
}
@OnOpen
public void onOpen(Session session) {
chatService.addSession(session);
}
@OnClose
public void onClose(Session session) {
chatService.removeSession(session);
}
@OnError
public void onError(Session session, Throwable error) {
chatService.removeSession(session);
}
@OnMessage
public void onMessage(Session session, String message) {
chatService.broadcast(message);
}
}
复制代码
4. 聊天业务逻辑服务
import org.springframework.stereotype.Service;
import java.util.concurrent.ConcurrentHashMap;
@Service
public class ChatService {
private final Map<String, WebSocketSession> sessions = new ConcurrentHashMap<>();
public void addSession(WebSocketSession session) {
sessions.put(session.getId(), session);
}
public void removeSession(WebSocketSession session) {
sessions.remove(session.getId());
}
public void broadcast(String message) {
sessions.values().forEach(session -> {
try {
session.sendMessage(new TextMessage(message));
} catch (IOException e) {
// Handle exception
}
});
}
}
复制代码
5. 前端页面 JavaScript 代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Chat App</title>
</head>
<body>
<ul id="messages"></ul>
<form id="form" onsubmit="return false;">
<input type="text" id="message" autocomplete="off">
<button type="submit" onclick="sendMessage()">Send</button>
</form>
<script type="text/javascript">
const socket = new WebSocket("ws://localhost:8080/chat");
const messages = document.getElementById('messages');
const form = document.getElementById('form');
const messageInput = document.getElementById('message');
form.onsubmit = () => sendMessage();
socket.onmessage = function(event) {
const message = document.createElement('li');
message.textContent = event.data;
messages.appendChild(message);
};
function sendMessage() {
const message = messageInput.value;
if (message) {
socket.send(message);
messageInput.value = '';
}
}
</script>
</body>
</html>
复制代码
启动 Spring Boot 应用后,ChatApplication
类会初始化整个应用。
WebSocketConfig
类通过 @EnableWebSocket
启用 WebSocket 支持,并注册 ChatEndpoint
端点。
ChatEndpoint
类使用 @ServerEndpoint
注解定义 WebSocket 端点,并处理客户端连接、消息广播和异常。
ChatService
类管理 WebSocket 会话,并提供广播消息的方法。
前端页面提供一个简单的聊天界面,用户可以输入消息并发送。消息通过 WebSocket 发送到服务器,服务器再将消息广播给所有连接的客户端。
评论