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

Node.js中在WebSocket存储自定义对象的实现方案

实现方法:直接在WebSocket实例中附加自定义对象

不用必须维护独立的对象映射表,绝大多数主流WebSocket服务器框架都支持直接在WebSocket连接实例上附加自定义属性或对象,收到客户端消息时可直接从实例中获取,以下是几种常见技术栈的实现方式:

Java 生态

Spring WebSocket

利用WebSocketSession的getAttributes()方法(内置线程安全的Map)存储自定义对象:

// 连接建立时存储自定义对象
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
    CustomClientData clientData = new CustomClientData();
    clientData.setUserId(generateUserId());
    clientData.setConnectTime(System.currentTimeMillis());
    // 存入session属性
    session.getAttributes().put("clientData", clientData);
}

// 处理消息时直接获取
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
    CustomClientData clientData = (CustomClientData) session.getAttributes().get("clientData");
    // 使用clientData处理业务逻辑
}

Tomcat WebSocket

通过Session的getUserProperties()方法操作自定义属性:

@OnOpen
public void onOpen(Session session) {
    CustomClientData clientData = new CustomClientData();
    // 存入用户属性
    session.getUserProperties().put("clientData", clientData);
}

@OnMessage
public void onMessage(String message, Session session) {
    CustomClientData clientData = (CustomClientData) session.getUserProperties().get("clientData");
    // 业务处理
}

Python(websockets 库)

Python是动态语言,可直接给WebSocketServerProtocol实例添加自定义属性:

import websockets
import asyncio

class CustomClientData:
    def __init__(self, user_id):
        self.user_id = user_id
        self.connect_time = asyncio.get_event_loop().time()

async def handle_connection(websocket):
    # 给websocket实例附加自定义对象
    websocket.client_data = CustomClientData(user_id="user_" + str(id(websocket)))
    async for message in websocket:
        # 直接获取自定义对象
        client_data = websocket.client_data
        print(f"Received message from {client_data.user_id}: {message}")

start_server = websockets.serve(handle_connection, "localhost", 8765)
asyncio.get_event_loop().run_until_complete(start_server)
asyncio.get_event_loop().run_forever()

Node.js(ws 库)

WebSocket实例支持直接添加自定义属性,无需额外配置:

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

function generateUserId() {
    return 'user_' + Math.random().toString(36).substring(2, 10);
}

wss.on('connection', (ws) => {
    // 附加自定义对象到WebSocket实例
    ws.clientData = {
        userId: generateUserId(),
        connectTime: Date.now()
    };

    ws.on('message', (data) => {
        // 直接获取自定义对象
        const { userId } = ws.clientData;
        console.log(`Message from ${userId}: ${data}`);
    });
});

注意事项

  • 线程/协程安全:多数框架的内置属性存储(如Spring的WebSocketSession属性)是线程安全的;动态添加属性时,若涉及多线程/协程操作,需自行保证同步。
  • 生命周期:自定义对象会和WebSocket连接绑定,连接关闭时对象会随实例一起被回收,无需手动清理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 19:41:00