推荐优先采用 spring boot + websocket 实现,通过添加 spring-boot-starter-websocket 依赖、配置端点与拦截器绑定用户 id、继承 textwebsockethandler 处理消息,并结合 redis 管理会话与消息路由,支持群聊、私聊及心跳保活。

Java 项目中集成 WebSocket 实现实时聊天与消息推送,核心是用标准的 javax.websocket(Java EE)或 spring-websocket(Spring 生态)建立长连接通道,配合服务端广播/点对点逻辑 + 前端监听,就能完成低延迟双向通信。Spring Boot 方案更主流、易维护,推荐优先采用。
使用 Spring Boot + WebSocket 快速搭建
Spring 提供了开箱即用的 WebSocket 支持,底层可基于 Tomcat、Jetty 或 Undertow,无需额外引入容器级依赖。
- 添加依赖(Maven):
org.springframework.boot
spring-boot-starter-websocket - 配置 WebSocket 端点(如
/ws/chat):
编写配置类,继承WebSocketConfigurer,重写registerWebSocketHandlers,注册WebSocketHandler并启用 SockJS(兼容不支持原生 WebSocket 的浏览器)。 - 定义消息处理逻辑:
继承TextWebSocketHandler,覆写afterConnectionEstablished(上线)、handleTextMessage(收消息)、afterConnectionClosed(下线),用ConcurrentHashMap或 Redis 管理在线用户 Session。
实现用户识别与会话管理
原生 WebSocket 不带用户上下文,需手动绑定身份,否则无法精准推送。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- 握手阶段传参:前端连接时在 URL 后加参数,如
ws://localhost:8080/ws/chat?userId=1001;服务端通过HandshakeInterceptor解析并存入attributes,后续在Session中获取。 - Session 绑定用户 ID:
在afterConnectionEstablished中执行:
session.getAttributes().put("userId", userId); - 避免内存泄漏:
连接关闭时及时从用户映射表中移除该 Session;高并发场景建议用 Redis 存储在线用户列表和消息队列(如结合Redis Pub/Sub或 Stream)。
支持群聊、私聊与消息广播
消息路由逻辑决定功能边界,关键在“发给谁”。
- 群聊(广播):
遍历当前所有活跃 Session,过滤掉发送方自身(可选),调用session.sendMessage()推送 JSON 消息体。 - 私聊(点对点):
根据接收方userId查找其对应的 Session(需提前建立userId → Session映射),直接发送;若对方不在线,可落库暂存或返回离线提示。 - 消息格式建议统一:
使用标准 JSON,包含字段如{"type":"chat","from":1001,"to":1002,"content":"hello","timestamp":1715823456000},便于前后端解析和扩展(如支持图片、撤回等类型)。
前端对接与稳定性处理
浏览器端用原生 WebSocket API 即可,但要注意异常恢复与兼容性。
- 基础连接与监听:
const ws = new WebSocket('ws://localhost:8080/ws/chat?userId=1001');
ws.onmessage = e => console.log(JSON.parse(e.data));
ws.onclose = () => setTimeout(connect, 3000); // 自动重连 - 心跳保活(防意外断连):
服务端定时发送Ping帧,客户端收到后回Pong;或双方约定业务心跳包(如每 30 秒发一次{"type":"ping"})。 - 消息发送前校验连接状态:
调用ws.readyState === WebSocket.OPEN,否则缓存待发消息,待重连成功后补发。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










