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

HTTPS环境下Socket.io绑定服务器后无限轮询,无法切换WebSocket连接

Socket.IO在HTTPS环境下无法切换到WebSocket连接的问题解决

问题根源

你遇到的核心问题是服务端代码中的变量名拼写错误:

  • 你通过createServer创建的HTTPS服务器实例变量名为httpsServer
  • 但初始化Socket.IO时错误传入了未定义的httpServer变量,导致Socket.IO自动创建了一个默认的HTTP服务器(而非你配置的HTTPS服务器),这个默认服务器并未监听端口,因此客户端的WebSocket升级请求无法被正确处理,只能一直使用轮询作为 fallback。

修正后的服务端代码

将Socket.IO初始化时的httpServer替换为正确的httpsServer:

const express = require('express');
const cors = require('cors');
const path = require('path');
const { createServer } = require('https');
const fs = require('fs');
const socketio = require('socket.io');
const app = express();
const httpsServer = createServer(
  {
    key: fs.readFileSync(path.join(__dirname, 'cert', 'key.pem')),
    cert: fs.readFileSync(path.join(__dirname, 'cert', 'cert.pem')),
  },
  app,
);
const PORT = process.env.PORT || 5000;

app.use(
  cors({
    origin: 'https://localhost:3005',
    methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
    credentials: true,
  }),
);

// 修正:将httpServer改为httpsServer
const iosocket = socketio(httpsServer, {
  cors: {
    origin: 'https://localhost:3005',
    credentials: true,
  },
});

iosocket.on('connection', (socket) => {
  socket.on('start', (data) => {
    console.log('data :', data);
  });
  socket.on('disconnect', () => {
    console.log('disconnected');
  });
});

httpsServer.listen(PORT, () => {
  console.log('Server started at', PORT);
});

额外注意事项

  • 确保你的自签名证书已被客户端浏览器信任,否则WebSocket升级请求会因证书验证失败被拦截
  • 客户端的io("/")会自动适配当前HTTPS环境,使用wss协议发起连接,无需额外配置
  • 代理配置中的ws: true已正确开启WebSocket代理,无需修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 03:25:23