You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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');
});

关键说明

  1. WebSocket握手拦截:通过server.on('upgrade')监听WebSocket的握手请求,这是连接建立的前置阶段,在此处添加setTimeout可以真实模拟连接建立延迟。
  2. 多服务器模拟:通过URL路径区分X/Y/Z服务器,分别设置不同的延迟参数,完全匹配你的业务场景。
  3. 禁用自动绑定:创建wss时设置noServer: true,避免自动处理握手,改为手动控制时机。

验证场景

  • 前端同时发起2次/api/X的HTTP请求 + 3次/api/X的WebSocket连接尝试
  • 此时发起/api/Y或/api/Z的请求,会观察到因HTTP/1.1的连接限制(默认同一域名最多6个并发连接)而被阻塞,验证你的推测。

内容的提问来源于stack exchange,提问作者rachitiitr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:35:22