JeecgBoot集成WebSocket聊天室:群聊与私聊功能实现

JeecgBoot集成WebSocket聊天室:群聊与私聊功能实现

【免费下载链接】JeecgBoot 🔥「企业级低代码平台」前后端分离架构SpringBoot 2.x/3.x,SpringCloud,Ant Design&Vue3,Mybatis,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领新的开发模式OnlineCoding->代码生成->手工MERGE,帮助Java项目解决70%重复工作,让开发更关注业务,既能快速提高效率,帮助公司节省成本,同时又不失灵活性。 【免费下载链接】JeecgBoot 项目地址: https://gitcode.com/GitHub_Trending/je/JeecgBoot

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); // 向指定用户的所有页面发送消息
    }
}

消息路由逻辑

  1. userPool获取目标用户的所有活跃连接
  2. 遍历连接发送消息,支持用户多页面同时接收

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模块和配置类,开发者可快速实现企业级聊天室功能。核心优势包括:

  1. 多连接管理:支持用户多页面同时在线
  2. 灵活消息路由:内置私聊/群聊路由机制
  3. 低代码集成:可直接使用平台代码生成器扩展功能

官方文档:jeecg-boot/README.md WebSocket源码:jeecg-boot/jeecg-module-demo/src/main/java/org/jeecg/modules/demo/mock/vxe/websocket/

【免费下载链接】JeecgBoot 🔥「企业级低代码平台」前后端分离架构SpringBoot 2.x/3.x,SpringCloud,Ant Design&Vue3,Mybatis,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领新的开发模式OnlineCoding->代码生成->手工MERGE,帮助Java项目解决70%重复工作,让开发更关注业务,既能快速提高效率,帮助公司节省成本,同时又不失灵活性。 【免费下载链接】JeecgBoot 项目地址: https://gitcode.com/GitHub_Trending/je/JeecgBoot

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值