使用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>
- 检查跨域与版本兼容性
- 如果客户端和服务端端口不同,需要在服务端初始化Socket.IO时配置跨域规则,示例:
var io = require('socket.io')(serv,{ cors: { origin: "你的客户端地址,测试时可填*" } });
- 确保服务端安装的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
相关产品推荐
相关产品推荐

