如何在Node.js中模拟含WebSocket连接延迟的卡顿Web服务器
解决方案:延迟WebSocket连接建立阶段
要模拟WebSocket连接建立时的延迟,不能依赖wss.on('connection')(该事件在连接已建立后触发),需要在HTTP握手阶段添加延迟。以下是修改后的完整代码,同时支持模拟不同服务器(X/Y/Z)的延迟差异:
const express = require('express'); const http = require('http'); const WebSocket = require('ws'); const app = express(); const server = http.createServer(app); const wss = new WebSocket.Server({ noServer: true }); // 禁用自动服务器绑定 // 模拟不同服务器的延迟配置 const serverDelays = { X: { http: 50000, ws: 60000 }, // X服务器:HTTP延迟50秒,WebSocket连接延迟60秒 Y: { http: 100, ws: 100 }, // Y服务器:正常响应 Z: { http: 100, ws: 100 } // Z服务器:正常响应 }; // HTTP路由:按服务器标识分配延迟 app.get('/api/:server', (req, res) => { const { server } = req.params; const delay = serverDelays[server]?.http || 100; setTimeout(() => { res.send(`HTTP Response from ${server}: 200 OK`); }, delay); }); // 拦截WebSocket握手请求,添加连接建立延迟 server.on('upgrade', (req, socket, head) => { // 从URL解析目标服务器(如ws://localhost:8080/api/X) const serverMatch = req.url.match(/\/api\/(\w+)/); const server = serverMatch ? serverMatch[1] : 'default'; const delay = serverDelays[server]?.ws || 100; // 延迟执行握手逻辑,模拟连接建立阶段卡顿 setTimeout(() => { wss.handleUpgrade(req, socket, head, (ws) => { wss.emit('connection', ws, req); }); }, delay); }); // WebSocket消息处理(连接建立后逻辑) wss.on('connection', (ws, req) => { const server = req.url.match(/\/api\/(\w+)/)[1]; console.log(`WebSocket connection established with ${server}`); ws.on('message', (message) => { ws.send(`Received from ${server}: ${message}`); }); }); server.listen(8080, () => { console.log('Mock服务器运行在端口8080'); console.log('HTTP测试地址:http://localhost:8080/api/X /api/Y /api/Z'); console.log('WebSocket测试地址:ws://localhost:8080/api/X /api/Y /api/Z'); });
关键说明
- WebSocket握手拦截:通过
server.on('upgrade')监听WebSocket的握手请求,这是连接建立的前置阶段,在此处添加setTimeout可以真实模拟连接建立延迟。 - 多服务器模拟:通过URL路径区分X/Y/Z服务器,分别设置不同的延迟参数,完全匹配你的业务场景。
- 禁用自动绑定:创建
wss时设置noServer: true,避免自动处理握手,改为手动控制时机。
验证场景
- 前端同时发起2次
/api/X的HTTP请求 + 3次/api/X的WebSocket连接尝试 - 此时发起
/api/Y或/api/Z的请求,会观察到因HTTP/1.1的连接限制(默认同一域名最多6个并发连接)而被阻塞,验证你的推测。
内容的提问来源于stack exchange,提问作者rachitiitr
相关产品推荐
相关产品推荐

