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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:03:14