1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| var express = require('express'); var expressWs = require('express-ws'); var app = express(); expressWs(app);
var PORT = 7777; var clientObject = {};
app.ws('/', (client, req) => { var key = req.socket.remoteAddress + "_" + req.socket.remotePort; clientObject[key] = { cli: client, lastActiveTime: Date.now(), // 记录最后活跃时间 };
client.on('message', (message) => { client.send("收到你的消息了" + message); clientObject[key].lastActiveTime = Date.now(); // 更新最后活跃时间 });
client.on('close', (code, reason) => { console.log(`WebSocket close event code: ${code}, reason: ${reason}`); delete clientObject[key]; });
client.on('error', (err) => { console.error("WebSocket error observed:", err); delete clientObject[key]; }); });
app.get('/', (req, res) => { res.send("hello 2023"); });
// 封装心跳逻辑 function setupHeartbeat() { setInterval(() => { var time = Date.now(); for (var key in clientObject) { var client = clientObject[key].cli; var lastActiveTime = clientObject[key].lastActiveTime; // 检查最后一次活跃时间是否超过了1分钟(60000毫秒) if (time - lastActiveTime > 60000) { console.log('Client timed out due to inactivity:', key); // 关闭连接,删除 client.close(); delete clientObject[key]; continue; }
try { var sData = { rspdata: { heartBeat: time, time: time, }, }; client.send(JSON.stringify(sData)); } catch (e) { console.error("Heartbeat error:", e); // 如果发送心跳失败,也关闭连接 client.close(); delete clientObject[key]; } } }, 3000); // 每3秒发送一次心跳 }
app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); setupHeartbeat(); // 设置心跳检测 });
|