使用ws npm库创建WSS WebSocket服务报错:socket hang up
如何用
ws库创建支持WSS的WebSocket服务 当然可以创建支持WSS(WebSocket Secure)的服务啦!你现在遇到的socket hang up错误,是因为你的代码只启动了普通的WS服务,没有配置SSL证书——WSS本质上是WS加TLS加密,必须要有证书才能正常工作。下面一步步教你解决:
1. 生成本地测试用的自签名SSL证书
因为是本地开发测试,我们可以用openssl生成自签名证书(生产环境一定要用正规CA颁发的证书,比如Let's Encrypt的免费证书)。打开终端执行以下命令:
openssl req -x509 -newkey rsa:2048 -nodes -sha256 -subj '/CN=localhost' -keyout localhost.key -out localhost.crt
这条命令会在当前目录生成两个文件:localhost.key(私钥)和localhost.crt(证书),参数简单解释下:
-x509:生成符合X.509标准的证书-newkey rsa:2048:同时生成2048位的RSA私钥-nodes:私钥不设置密码,方便本地使用-subj '/CN=localhost':指定证书的通用名称为localhost,匹配我们的本地测试域名
2. 修改代码,配置WSS服务
有两种方式可以配置,选一种你觉得顺手的就行:
方式一:直接在WebSocket.Server里配置证书
const fs = require('fs'); const WebSocket = require('ws'); // 读取刚才生成的证书和私钥 const sslOptions = { cert: fs.readFileSync('./localhost.crt'), key: fs.readFileSync('./localhost.key') }; // 创建WSS服务器,传入sslOptions const wss = new WebSocket.Server({ ...sslOptions, port: 8080 }); wss.on('connection', (ws) => { console.log('WSS连接成功!'); // 可以给客户端发个欢迎消息测试 ws.send('Hello from WSS server!'); });
方式二:先创建HTTPS服务器,再挂载WSS
这种方式适合需要同时运行HTTPS服务和WSS服务的场景,两者可以共用同一个端口:
const https = require('https'); const fs = require('fs'); const WebSocket = require('ws'); // 创建HTTPS服务器 const httpsServer = https.createServer({ cert: fs.readFileSync('./localhost.crt'), key: fs.readFileSync('./localhost.key') }); // 把WSS挂载到HTTPS服务器上 const wss = new WebSocket.Server({ server: httpsServer }); wss.on('connection', (ws) => { console.log('WSS连接成功!'); }); // 启动服务器监听8080端口 httpsServer.listen(8080, () => { console.log('WSS服务器运行在wss://localhost:8080'); });
3. 测试WSS连接
因为我们用的是自签名证书,wscat默认会验证证书合法性,所以需要加--no-check参数跳过验证,终端执行:
wscat -c wss://localhost:8080 --no-check
现在就能成功连接,看到服务器的日志和欢迎消息啦!
生产环境注意事项
- 不要用自签名证书,去正规CA申请信任的证书(比如Let's Encrypt是免费的)
- 确保证书和私钥的文件路径正确,并且服务器有读取权限
- 如果用云服务,可能需要在控制台配置SSL证书,不需要自己在代码里处理
内容的提问来源于stack exchange,提问作者physicsboy
相关产品推荐
相关产品推荐

