NodeJS WebSocket服务端发消息报错:readyState 0 (CONNECTING)
解决WebSocket错误:Error: WebSocket is not open: readyState 0 (CONNECTING)
问题原因
WebSocket连接是异步建立的,你在创建客户端实例后立刻调用send(),此时连接还处于**CONNECTING(readyState=0)**状态,握手尚未完成,因此无法发送消息导致报错。
解决方案
必须等待WebSocket客户端触发open事件(表示连接已成功建立)后,再调用send()方法。同时建议添加error监听,处理连接失败的异常情况。
修改后的代码
server.js(修正后)
const express = require('express'); const WebSocket = require('ws'); const wsClient = new WebSocket('ws://localhost:1998/'); // 连接成功后发送消息 wsClient.on('open', () => { console.log('已连接到目标WebSocket服务端'); wsClient.send('Hialo'); }); // 监听连接错误,避免程序崩溃 wsClient.on('error', (err) => { console.error('连接失败:', err); }); const app = express(); const server = app.listen(1989, () => { console.log('App is listening on 1989'); }); const wss = new WebSocket.Server({ server: server }); wss.on("connection", ws => { console.log("有新客户端连接到当前服务端!"); ws.on('message', (message) => { console.log(`收到消息:${message}`); }) })
client.js(优化命名,功能不变)
const express = require('express'); const WebSocket = require('ws'); const app = express(); const server = app.listen(1998, () => { console.log('App is listening on 1998'); }); const wss = new WebSocket.Server({ server: server }); wss.on("connection", ws => { console.log("有新客户端接入!"); ws.on('message', (message) => { console.log(`收到消息:${message}`); }) })
执行说明
- 先启动
client.js(它作为WebSocket服务端,监听1998端口) - 再启动
server.js,此时客户端会成功连接并发送消息
WebSocket readyState状态说明
- 0: CONNECTING - 正在建立连接
- 1: OPEN - 连接已就绪,可正常收发消息
- 2: CLOSING - 连接正在关闭
- 3: CLOSED - 连接已关闭
内容的提问来源于stack exchange,提问作者Mustafa Koşmaz
相关产品推荐
相关产品推荐

