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
相关产品推荐
相关产品推荐

