You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Node.js的WebSocket服务器如何向指定群组发送消息?

实现WebSocket服务器的指定群组消息推送

核心思路

要实现仅向指定群组发送消息,核心是给每个客户端连接绑定群组标识,发送消息时筛选出目标群组内的在线客户端进行推送,而非广播给所有客户端。

具体实现步骤

1. 给客户端连接绑定群组属性

当客户端建立连接后,需要让它告知服务器要加入的群组(比如发送结构化消息),服务器在对应的WebSocket对象上添加group属性,标记该客户端所属的群组。

2. 使用结构化消息格式

不再直接发送纯文本,改用JSON格式的消息,明确包含目标群组和消息内容,示例格式:

{"action":"send","group":"teamA","content":"下午3点开站会!"}

3. 修改消息处理逻辑

解析客户端发来的JSON消息,根据不同操作(比如join加入群组、send发送群消息)做对应处理;发送消息时仅遍历目标群组的在线客户端。

修改后的完整代码

const WebSocket = require('ws');
const server = new WebSocket.Server({ port: 3000 })

server.on('connection', ws => {
    // 初始化默认群组(可选)
    ws.group = 'default';

    ws.on('message', rawMessage => {
        try {
            const message = JSON.parse(rawMessage);
            
            switch(message.action) {
                case 'join':
                    // 处理客户端加入群组的请求
                    ws.group = message.group;
                    ws.send(`已成功加入群组:${message.group}`);
                    break;
                case 'send':
                    // 仅向目标群组的在线客户端推送消息
                    server.clients.forEach(client => {
                        if (client.readyState === WebSocket.OPEN && client.group === message.group) {
                            client.send(`[${message.group}] ${message.content}`);
                        }
                    });
                    break;
                case 'exit':
                    ws.close();
                    break;
                default:
                    ws.send('未知指令,请检查消息格式');
            }
        } catch (err) {
            // 处理非JSON格式的消息
            ws.send('请使用JSON格式发送消息,示例:{"action":"send","group":"teamA","content":"消息内容"}');
        }
    })
})

客户端测试示例

可以直接在浏览器控制台测试连接和消息发送:

// 建立连接
const ws = new WebSocket('ws://localhost:3000');
// 加入teamA群组
ws.send(JSON.stringify({action:'join', group:'teamA'}));
// 向teamA发送消息
ws.send(JSON.stringify({action:'send', group:'teamA', content:'大家好!'}));

扩展建议

  • 若需支持多群组,可将ws.group改为数组,存储客户端加入的所有群组,发送时匹配数组内的任一群组。
  • 可维护全局群组映射表(比如const groups = { teamA: [ws1, ws2], teamB: [ws3] }),减少遍历所有客户端的开销,适合大用户量场景。
  • 添加客户端断开连接时的清理逻辑,避免无效连接留在群组关联数据中。

内容的提问来源于stack exchange,提问作者Pavel Fedorovsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 02:50:51