添加websocket连接

This commit is contained in:
2026-09-22 16:27:22 +08:00
parent 991993e0c2
commit d02a2c7d5a
25 changed files with 5829 additions and 3 deletions
+122
View File
@@ -0,0 +1,122 @@
const WebSocket = require("ws");
const url = require("url");
const { verifyToken } = require("../utils/jwt");
const {
addConnection,
getConnection,
removeConnection,
} = require("./connectionManager");
// 创建WebSocket服务
function initWebSocket(server) {
const wss = new WebSocket.Server({
server,
});
wss.on("connection", (ws, request) => {
console.log("有新的WebSocket连接");
// 获取URL中的token
const query = url.parse(request.url, true).query;
const token = query.token;
if (!token) {
console.log("没有提供token");
ws.close();
return;
}
// 验证JWT
let user;
try {
user = verifyToken(token);
} catch (error) {
console.log("JWT验证失败:", error.message);
ws.close();
return;
}
console.log("WebSocket用户:", user);
const username = user.username;
// 保存连接
addConnection(username, ws);
// 接收客户端消息
ws.on("message", (message) => {
try {
const data = JSON.parse(message.toString());
console.log("收到WebSocket消息:", data);
handleMessage(username, data);
} catch (error) {
console.error("WebSocket消息处理失败:", error);
}
});
// 连接关闭
ws.on("close", () => {
removeConnection(username);
});
// WebSocket错误
ws.on("error", (error) => {
console.error(`用户 ${username} WebSocket错误:`, error);
});
});
console.log("WebSocket服务已启动");
return wss;
}
// 处理WebSocket消息
function handleMessage(username, data) {
switch (data.type) {
case "sendMessage":
handleSendMessage(username, data);
break;
default:
console.log("未知消息类型:", data.type);
}
}
// 处理发送消息
function handleSendMessage(senderName, data) {
const receiverName = data.receiverName;
const content = data.content;
console.log(
`${senderName} → ${receiverName}:${content}`
);
// 找到接收者的WebSocket
const receiverWs = getConnection(receiverName);
if (!receiverWs) {
console.log(`${receiverName} 当前不在线`);
return;
}
// 推送消息
receiverWs.send(
JSON.stringify({
type: "newMessage",
message: {
senderName,
receiverName,
content,
},
})
);
}
module.exports = initWebSocket;