Unity中Socket.IO命名空间如何无需新建连接初始化?
在Unity中复用Socket.IO连接初始化命名空间的正确方式
错误原因
你第一段代码里直接调用socket("/my-namespace")的写法并非SocketIOUnity库的合法API,这是导致初始化失败的核心原因。Socket.IO的命名空间设计本身就支持在同一连接上复用,无需为每个命名空间新建独立连接。
正确实现方案
在主Socket连接成功建立后,通过SocketIOUnity实例提供的GetNamespace方法获取目标命名空间的实例,即可实现单连接下的命名空间复用。
修改后的完整代码示例:
public SocketIOUnity socket; private SocketIOClient.SocketIONamespace nsp; // 命名空间实例类型为SocketIONamespace void Start() { var uri = new Uri("http://192.168.1.5:11100"); socket = new SocketIOUnity(uri, new SocketIOOptions { Transport = SocketIOClient.Transport.TransportProtocol.WebSocket }); socket.JsonSerializer = new NewtonsoftJsonSerializer(); socket.OnConnected += (sender, e) => { Debug.Print("主socket连接成功"); // 主连接建立后,获取目标命名空间 nsp = socket.GetNamespace("/my-namespace"); // 为命名空间绑定连接/断开事件 nsp.OnConnected += (nsSender, nsE) => { Debug.Print("命名空间/my-namespace 连接成功"); }; nsp.OnDisconnected += (nsSender, nsE) => { Debug.Print("命名空间/my-namespace 断开连接: " + nsE); }; // 触发命名空间握手(基于已有连接,不会新建TCP连接) nsp.Connect(); }; socket.OnDisconnected += (sender, e) => { Debug.Print("主socket断开连接: " + e); }; socket.Connect(); }
关键说明
- 命名空间实例的类型是
SocketIOClient.SocketIONamespace,而非SocketIOUnity(后者是整个连接的根实例)。 - 必须在主
socket.OnConnected回调内操作命名空间,确保主连接已完成握手。 - 调用
nsp.Connect()时,库会在已有的TCP连接上发送命名空间的握手请求,完全符合Socket.IO的复用设计。
内容的提问来源于stack exchange,提问作者karimi
相关产品推荐
相关产品推荐

