WebSocket是一种在单个TCP连接上进行全双工通信的协议,非常适合需要实时数据推送的场景(如聊天室、实时监控等)。本文将通过Spring Boot演示如何建立WebSocket服务并实现前后端实时通信。

  一、环境准备

使用[Spring Initializr]创建项目,添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

  二、服务端实现

   1. 配置WebSocket

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

    // 注册STOMP端点
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/ws")
                .setAllowedOriginPatterns("*")
                .withSockJS();
    }

    // 配置消息代理
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic"); // 客户端订阅地址前缀
        registry.setApplicationDestinationPrefixes("/app"); // 服务端接收地址前缀
    }
}

   2. 创建消息控制器

@Controller
public class MessageController {

    @Autowired
    private SimpMessagingTemplate messagingTemplate;

    // 处理客户端发来的消息
    @MessageMapping("/send/message")
    public void handleMessage(String message) {
        // 广播消息给所有订阅/topic/messages的客户端
        messagingTemplate.convertAndSend("/topic/messages", 
            "Server响应: " + message + " [" + LocalDateTime.now() + "]");
    }
}

  三、前端实现

<!DOCTYPE html>
<html>
<body>
    <input type="text" id="messageInput">
    <button onclick="sendMessage()">发送</button>
    <div id="messages"></div>

    <script src="https://cdn.jsdelivr.net/npm/sockjs-client@1.5.0/dist/sockjs.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
    <script>
        const socket = new SockJS('http://localhost:8080/ws');
        const stompClient = Stomp.over(socket);

        stompClient.connect({}, (frame) => {
            // 订阅消息通道
            stompClient.subscribe('/topic/messages', (response) => {
                const msgDiv = document.createElement('div');
                msgDiv.textContent = response.body;
                document.getElementById('messages').appendChild(msgDiv);
            });
        });

        function sendMessage() {
            const message = document.getElementById('messageInput').value;
            stompClient.send("/app/send/message", {}, message);
        }
    </script>
</body>
</html>

  四、运行测试

1. 启动Spring Boot应用
2. 访问HTML页面(可打开多个浏览器窗口模拟多个客户端)
3. 输入消息并发送,观察所有客户端实时更新

  五、生产环境建议

1. 使用RabbitMQ或ActiveMQ作为消息代理(替代内存代理)
2. 添加JWT鉴权机制
3. 配置消息大小限制(默认限制为64KB)
4. 实现连接状态监听器(统计在线用户等)

通过这个示例,您可以快速为Spring Boot应用添加实时通信能力。根据具体业务需求,可以扩展消息类型处理、用户定向推送等功能。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐