JeecgBoot集成WebSocket聊天室:群聊与私聊功能实现
WebSocket(套接字)技术能够在客户端和服务器之间建立持久连接,实现实时双向通信,非常适合开发聊天室等实时交互功能。JeecgBoot作为企业级低代码平台,通过内置的WebSocket模块,可快速实现群聊、私聊等功能。本文将详细介绍如何基于JeecgBoot实现完整的聊天室系统。
WebSocket基础配置
JeecgBoot的WebSocket功能由核心模块中的配置类和常量类提供基础支持。首先需要通过配置类启用WebSocket支持,并定义连接端点和消息格式。
1. 配置类实现
WebSocket的核心配置位于jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/WebSocketConfig.java,该类通过@ServerEndpoint注解注册WebSocket端点,并配置连接过滤器:
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
@Bean
public FilterRegistrationBean getFilterRegistrationBean(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(websocketFilter());
bean.addUrlPatterns("/vxeSocket/*"); // 注册WebSocket端点
return bean;
}
}
2. 常量定义
消息格式和类型常量定义在jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/WebsocketConst.java中,包括消息类型、JSON键名等:
public class WebsocketConst {
public static final String MSG_CMD = "cmd"; // 消息类型键
public static final String MSG_USER_ID = "userId"; // 用户ID键
public static final String CMD_USER = "user"; // 私聊消息类型
public static final String CMD_TOPIC = "topic"; // 群聊消息类型
}
聊天室核心实现
JeecgBoot的WebSocket聊天室功能通过VxeSocket类实现,该类处理连接管理、消息路由和用户状态维护。核心代码位于jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/VxeSocket.java。
1. 连接管理机制
系统使用两级连接池管理用户会话:
userPool:按用户ID和页面ID组织连接,支持多页面同时在线socketPool:管理所有活跃连接,支持全局广播
// 用户连接池:userId -> {pageId -> VxeSocket}
private static Map<String, Map<String, VxeSocket>> userPool = new HashMap<>();
// 全局连接池:socketId -> VxeSocket
private static Map<String, VxeSocket> socketPool = new HashMap<>();
2. 连接生命周期
- 建立连接:
@OnOpen注解方法处理新连接,将用户会话加入连接池 - 断开连接:
@OnClose注解方法移除连接,清理资源 - 接收消息:
@OnMessage注解方法解析消息并路由
@OnOpen
public void onOpen(Session session, @PathParam("userId") String userId, @PathParam("pageId") String pageId) {
this.userId = userId;
this.pageId = pageId;
socketPool.put(socketId, this); // 加入全局连接池
getUserPool(userId).put(pageId, this); // 加入用户连接池
}
功能实现详解
1. 群聊功能
群聊功能通过向所有在线用户广播消息实现,核心方法为sendMessageToAll:
public static void sendMessageToAll(String message) {
for (VxeSocket socketItem : socketPool.values()) {
socketItem.sendMessage(message); // 遍历所有连接发送消息
}
}
使用场景:系统通知、公共聊天频道等需要全体用户可见的消息。
2. 私聊功能
私聊通过用户ID定向发送消息,核心方法为sendMessageTo:
public static void sendMessageTo(String userId, String message) {
Collection<VxeSocket> values = getUserPool(userId).values();
for (VxeSocket socketItem : values) {
socketItem.sendMessage(message); // 向指定用户的所有页面发送消息
}
}
消息路由逻辑:
- 从
userPool获取目标用户的所有活跃连接 - 遍历连接发送消息,支持用户多页面同时接收
3. 消息格式
标准消息JSON格式:
{
"cmd": "user", // 消息类型(user:私聊,topic:群聊)
"userId": "1001", // 发送者ID
"msgTxt": "Hello World",// 消息内容
"timestamp": 1620000000 // 时间戳
}
实际应用示例
1. 前端连接代码
在Vue组件中建立WebSocket连接:
// 建立连接
const socket = new WebSocket(`ws://localhost:8080/vxeSocket/${userId}/${pageId}`);
// 发送消息
function sendMessage(cmd, content) {
socket.send(JSON.stringify({
cmd: cmd,
userId: currentUser.id,
msgTxt: content
}));
}
// 接收消息
socket.onmessage = function(event) {
const msg = JSON.parse(event.data);
handleMessage(msg); // 处理消息显示
};
2. 后端消息处理
服务端接收消息后根据类型路由:
@OnMessage
public void onMessage(String message) {
JSONObject json = JSON.parseObject(message);
String cmd = json.getString(WebsocketConst.MSG_CMD);
switch (cmd) {
case WebsocketConst.CMD_USER:
handlePrivateMessage(json); // 处理私聊
break;
case WebsocketConst.CMD_TOPIC:
handleGroupMessage(json); // 处理群聊
break;
}
}
功能扩展建议
1. 消息持久化
可结合JeecgBoot的代码生成器创建消息记录表,在发送消息时同时保存到数据库:
CREATE TABLE `sys_chat_message` (
`id` varchar(32) NOT NULL,
`sender_id` varchar(32) NOT NULL COMMENT '发送者ID',
`receiver_id` varchar(32) DEFAULT NULL COMMENT '接收者ID(群聊为空)',
`content` text NOT NULL COMMENT '消息内容',
`send_time` datetime NOT NULL COMMENT '发送时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2. 在线状态显示
通过连接池状态实现用户在线状态监控:
// 获取在线用户列表
public static List<String> getOnlineUsers() {
return new ArrayList<>(userPool.keySet());
}
总结
JeecgBoot提供了完整的WebSocket基础设施,通过本文介绍的VxeSocket模块和配置类,开发者可快速实现企业级聊天室功能。核心优势包括:
- 多连接管理:支持用户多页面同时在线
- 灵活消息路由:内置私聊/群聊路由机制
- 低代码集成:可直接使用平台代码生成器扩展功能
官方文档:jeecg-boot/README.md WebSocket源码:jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



