Arduino与Node.js Socket.io通信遇WebSocket握手400错误求助
解决WebSocket握手400错误的问题
嘿,我之前也碰到过类似的诡异问题——明明代码没动,突然就出握手错误了!咱们一步步来排查修复:
首先,我一眼就看到你的Node.js代码里有个致命小问题:你重复初始化了两次Socket.IO!这会导致同一个HTTP服务器上挂载了两套Socket.IO服务,直接引发握手时的冲突,这大概率就是你遇到400错误的核心原因。
第一步:先修复重复初始化的问题
你的代码里现在有这两行重复的初始化代码:
io.listen(server); var listener = io.listen(server);
完全没必要保留两次,删掉第一行单独的io.listen(server);,只留一次初始化就行。修改后的核心代码块应该是这样:
// 删掉重复的io.listen(server); 这一行 var listener = io.listen(server); listener.sockets.on('connection', function(socket){ console.log('1 connection'); function ReadSerialData(data){ console.log(data); console.log('Connection'); // 顺便给串口数据去掉换行符,避免客户端收到多余空白 socket.emit('message', {'message': data.trim()}) } parser.on('data', ReadSerialData); });
第二步:排查其他可能的隐藏问题
如果修复后还是有问题,咱们再检查这些点:
- 串口端口是否漂移:有时候USB重新插拔会导致Arduino的端口号变化,确认
COM3还是当前正确的端口。可以加一段代码列出所有可用串口:SerialPort.list().then(ports => { ports.forEach(port => { console.log('可用串口:', port.path); }); }); - Socket.IO版本兼容性:如果你的依赖包自动更新过,可能客户端和服务端的Socket.IO版本不匹配。在服务端控制台打印版本:
console.log('Socket.IO版本:', io.version),客户端在浏览器控制台输入io.version查看,确保两者版本一致。 - 浏览器缓存坑:旧的
socket.io.js缓存可能导致连接异常,强制刷新页面(Ctrl+F5),或者给脚本链接加个版本号:<script src="/socket.io/socket.io.js?v=1"></script> - 显式指定连接地址:客户端的
io.connect()可以显式指定地址,避免路径歧义:var socket = io.connect('http://localhost:5000');
我之前就是因为不小心重复初始化了Socket.IO,导致一模一样的400握手错误,修复后立刻就正常了,你先试试第一步的修改,应该能解决问题!
内容的提问来源于stack exchange,提问作者Mattia Surricchio
相关产品推荐
相关产品推荐

