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

使用express、socket.io、nodejs开发游戏时客户端收不到服务端socket.io推送

问题排查与解决方案
  • 首先修改服务端错误覆盖socket.id的问题
    Socket.IO 内部默认会为每个连接生成唯一的socket.id用于消息路由,你手动用Math.random()覆盖该属性会导致内部路由失效,服务端无法找到目标客户端推送事件,删除覆盖socket.id的代码即可:
// 删除 socket.id = Math.random(); 这一行
// 你可以自定义其他属性存储标识,比如:
socket.customId = Math.random();
SOCKET_LIST[socket.customId] = socket;
  • 修复客户端元素ID拼写错误
    你获取登录、注册按钮的ID拼写错误,sing应为sign,否则获取不到按钮元素,无法绑定点击事件触发登录请求:
// 修改前
// var signDivSignIn = document.getElementById('singDiv-singIn');
// var signDivSignUp = document.getElementById('signDiv-singUp');
// 修改后
var signDivSignIn = document.getElementById('signDiv-signIn');
var signDivSignUp = document.getElementById('signDiv-signUp');
  • 确认登录函数绑定到按钮点击事件
    你定义的signDivSignInfunc函数需要手动绑定到登录按钮的点击事件,否则点击按钮不会触发登录请求,可直接在HTML的登录按钮标签上添加属性:
<button id="signDiv-signIn" onclick="signDivSignInfunc()">登录</button>
  • 检查跨域与版本兼容性
  1. 如果客户端和服务端端口不同,需要在服务端初始化Socket.IO时配置跨域规则,示例:
var io = require('socket.io')(serv,{
  cors: {
    origin: "你的客户端地址,测试时可填*"
  }
});
  1. 确保服务端安装的Socket.IO版本和客户端引入的Socket.IO客户端版本大版本一致,否则会出现兼容问题导致事件无法收发。
  • 补充调试日志确认连接状态
    可分别在两端添加连接日志确认连接正常:
    服务端connection回调内添加:
console.log('新客户端连接,id为:', socket.id)

客户端代码添加:

socket.on('connect', () => {
  console.log('连接服务端成功,当前socket id:', socket.id)
})
  • 检查服务端代码语法完整性
    你贴出的服务端代码缺少两处闭合括号,实际运行前需补充完整,否则服务端会启动报错:
}) // 补充socket.on('signIn')的回调闭合
}) // 补充io.sockets.on('connection')的回调闭合

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 19:12:02