Unity项目Socket.IO跨可执行文件socket.On无法接收消息求助
Unity Socket.IO跨可执行文件无法接收Mesh数据的解决方法
核心问题分析
你当前的服务器代码中,使用socket.emit('mesh', data)只会将消息仅回复给发送该消息的客户端。当你运行两个不同的Unity可执行文件时,它们会建立两个独立的Socket连接,所以发送方的消息不会被另一个客户端接收到。
服务器代码修改方案
根据你的需求,将服务器的消息发送逻辑替换为以下方式之一:
方案1:发送给所有连接的客户端(包括发送者)
const express = require('express'); const app = express(); const http = require('http').createServer(app); const io = require('socket.io')(http, { maxHttpBufferSize: 10e6 // 增大缓冲区到10MB }); http.listen(8080, () => { console.log('Server listening on port 8080'); }); io.on('connection', (socket) => { console.log('a user connected'); socket.on('mesh', (data) => { console.log('Message from client', data); // 发送给所有已连接的客户端 io.emit('mesh', data); }); socket.on('disconnect', () => { console.log('user disconnected'); }); });
方案2:发送给除发送者外的所有客户端
如果不需要让发送者自己收到重复消息,替换成:
socket.broadcast.emit('mesh', data);
方案3:基于房间的定向发送(适合多分组场景)
如果需要将消息发送给特定分组的客户端,可以使用Socket.IO的房间功能:
io.on('connection', (socket) => { console.log('a user connected'); // 客户端连接时自动加入指定房间 socket.join('mesh-group'); socket.on('mesh', (data) => { console.log('Message from client', data); // 发送给房间内所有客户端 io.to('mesh-group').emit('mesh', data); }); socket.on('disconnect', () => { console.log('user disconnected'); }); });
客户端额外检查项
- 确认两个可执行文件都成功连接服务器:查看服务器控制台是否打印两次
a user connected - 匹配Socket.IO版本:确保Unity端的
SocketIOUnity插件版本与服务器端socket.io包版本一致(比如均为v4.x),版本不兼容会导致事件无法正常接收 - 端口权限检查:确保本地防火墙未拦截8080端口,两个可执行文件所在环境能正常访问该端口
内容的提问来源于stack exchange,提问作者Angel Corral
相关产品推荐
相关产品推荐

