React Native集成Socket.io无法从设备发送事件问题排查
React Native Socket.io 自定义事件无响应问题解决
看起来你已经搞定了客户端和服务器的基础连接,但自定义事件没触发,问题出在服务器端的事件监听方式上!
核心问题:事件监听挂载对象错误
你现在把sendKeys事件的监听挂在了全局的io对象上,但客户端发送的事件是发送到每个连接对应的socket实例上的,而不是全局io。全局io只用来监听connect这类全局连接事件,单个客户端的自定义事件必须在connect回调里的socket对象上监听。
修改后的服务器代码
const express = require('express'); const app = express(); const server = require('http').Server(app); const io = require('socket.io')(server); const path = require('path'); const PORT_NUM = 3000; io.on('connect', (socket) => { console.log('someone joined!', socket.id); // 把自定义事件监听移到这里,绑定到当前连接的socket实例上 socket.on('sendKeys', () => { console.log('keys called!'); }); }); app.get('/', (req, res) => { res.sendFile(path.join(__dirname, '/index.html')); }); server.listen(PORT_NUM, () => { console.log(`Web Socket Encryption Server Running on *:${PORT_NUM}...`); });
额外检查项
- 事件名拼写/大小写:确保客户端
emit的sendKeys和服务器监听的完全一致,Socket.io事件名是区分大小写的 - Socket.io版本兼容性:确认客户端(
socket.io-client)和服务器端(socket.io)的主版本号一致(比如都是v4.x或v3.x),版本不匹配也可能导致事件无法触发 - RN客户端socket实例有效性:可以在
generateKeys里加个日志,确认this.socket不是undefined,比如:
async generateKeys() { console.log('Emitting sendKeys event', this.socket); this.socket.emit('sendKeys'); }
这样修改后,你的服务器应该就能接收到RN客户端发送的sendKeys事件了!
内容的提问来源于stack exchange,提问作者John Lippson
相关产品推荐
相关产品推荐

