WebSocket 连接与认证
建立连接
ws://ydzx.panretro.com/external/api/v1/im/imWebSocket/{accessToken}
客户端以标准 WebSocket 协议连接,accessToken 作为路径参数传入。
认证流程
客户端 服务端
│ │
│──── WS connect(token) ──────────→│
│ │─ 解析 accessToken
│ │─ 验证 scope (需要 "chat" scope)
│ │─ 注册 session 到 sessionMap
│ │─ 设置 maxIdleTimeout (60s)
│ │─ 启动心跳 (25s/Ping)
│←── LoginSuccess ────────────────│
│ {"type":"LoginSuccess", │
│ "code":200} │
│ │
│──── (开始收发消息) ──────────────→│
认证失败响应
Token 无效
{
"type": "LoginFail",
"code": 400
}
连接随后被服务端关闭。
缺少 chat 权限
{
"type": "LackOfPermission",
"code": 403
}
连接随后被服务端关闭。
多端支持
同一用户(同一 loginId)可建立多个 WebSocket 连接。服务端使用 ConcurrentHashMap<Long, List<Session>> 管理,推送消息时向所有在线端广播。
连接断开
客户端断连或网络异常时:
- 服务端
@OnClose触发 - 停止该 session 的心跳任务
- 从
sessionMap移除该 session - 若该用户无其他活跃 session,清理用户条目
服务端心跳
连接建立后,服务端每 25 秒 发送 WebSocket Ping 帧,60 秒无响应则判定超时断连。详见 心跳机制。
示例:使用 WebSocket 客户端连接
// 浏览器 JavaScript
const token = "40ddb09263e696c91dae3fc1bc909db0";
const ws = new WebSocket("ws://ydzx.panretro.com/external/api/v1/im/imWebSocket/" + token);
ws.onopen = function() {
console.log("已连接");
};
ws.onmessage = function(event) {
const msg = JSON.parse(event.data);
if (msg.type === "LoginSuccess") {
console.log("认证成功");
}
};
ws.onclose = function() {
console.log("连接已关闭");
};