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

Node.js应用中Socket.IO从ws://切换为wss://的配置方法

把Socket.IO从ws://切换到wss://的完整解决方案

我来帮你搞定这个切换问题,其实核心就是把Socket.IO绑定到HTTPS服务器上,而不是原来的普通HTTP服务器,下面是一步步的具体操作:

1. 先准备好SSL证书

首先你得有SSL证书:

  • 生产环境推荐用Let's Encrypt的免费可信证书(浏览器不会拦截)
  • 测试环境可以用openssl生成自签名证书(仅用于本地测试,浏览器会有安全警告)

假设你已经拿到了两个证书文件:

  • private.key:私钥文件
  • certificate.crt:证书文件

把这两个文件放到项目里的专门目录,比如./ssl/文件夹下。

2. 修改服务器端代码(index.js)

原来的代码用的是http.createServer(),现在要换成https.createServer(),然后把Socket.IO绑定到这个HTTPS服务器上。修改后的完整代码如下:

const path = require("path");
const express = require("express");
const app = express();
const cors = require("cors");
const https = require("https"); // 新增:引入https模块
const fs = require("fs"); // 新增:引入fs模块读取证书
const config = require("./config");
const webRoute = require("./lib/routes/web");
const widgetsRoute = require("./lib/routes/widgets");
const errorsHandler = require("./lib/handlers/errors");
const corsHandler = require("./lib/handlers/cors");

app.use(cors(corsHandler));
app.use(express.static(path.join(__dirname, "/public")));
app.use("/", webRoute);
app.use("/widgets", widgetsRoute);
app.use(errorsHandler);

// 新增:读取SSL证书文件
const sslOptions = {
  key: fs.readFileSync(path.join(__dirname, "./ssl/private.key")),
  cert: fs.readFileSync(path.join(__dirname, "./ssl/certificate.crt"))
};

// 新增:创建HTTPS服务器并绑定Express应用
const httpsServer = https.createServer(sslOptions, app);
// 让Express在HTTPS端口监听(推荐用默认443端口,也可以保留你原来的4118)
httpsServer.listen(4118, "0.0.0.0");

// 修改:把Socket.IO绑定到HTTPS服务器上
const io = require("socket.io")(httpsServer, {
  cors: {
    origin: "https://example.org", // 替换成你的客户端实际域名
    methods: ["GET", "POST"]
  }
});
require("./lib/inits/socket")(io);

可选:单独给Socket.IO开HTTPS端口

如果你不想让Express和Socket.IO共用同一个端口,也可以单独创建一个HTTPS服务器给Socket.IO,写法如下:

// 单独创建Socket.IO的HTTPS服务器
const socketHttpsServer = https.createServer(sslOptions);
socketHttpsServer.listen(4113, "0.0.0.0");
const io = require("socket.io")(socketHttpsServer, { cors: { ... } });

3. 修改客户端代码

把原来的http://换成https://,如果用了默认HTTPS端口(443),可以不用写端口号:

// 如果共用443默认端口
this.socket = io("https://example.org");

// 如果还是用自定义的4113端口
this.socket = io("https://example.org:4113");

几个关键注意事项

  • 生产环境一定要用可信证书,自签名证书会被浏览器拦截,导致连接失败
  • 确保服务器防火墙开放了对应的HTTPS端口(443或者你自定义的端口)
  • Socket.IO的CORS配置要和客户端域名匹配,不然会出现跨域错误

这样修改后,你再看浏览器的网络面板,就能看到Socket.IO用wss://协议建立连接了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:12:50