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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:07:29