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

Unity WebGL使用Best HTTP2插件的Socket.IO v2数据发送问题求助

解决Unity WebGL + Best HTTP2对接Socket.IO v2的JSON格式问题

一、修复Best HTTP2的emit数据格式问题

  • 检查插件配置:找到Socket.IO客户端初始化代码,查看是否有AutoEncodePayload这类自动序列化开关,若开启则关闭,手动控制数据发送格式。
  • 直接传递C#对象:不要先将数据序列化为JSON字符串,定义与后端结构匹配的类,直接把对象传入emit方法。示例:
    public class RequestData
    {
        public int id;
        public string content;
    }
    // 发送时直接传入对象实例
    socket.Emit("target-event", new RequestData { id = 123, content = "demo content" });
    
  • 修改插件序列化逻辑:如果插件强制将对象转为JSON字符串,可修改其Emit方法——替换插件自带的序列化逻辑为Json.NET序列化,注意不要给结果添加额外的字符串包裹,直接输出JSON对象结构。修改前务必备份插件代码,避免后续更新覆盖。

二、替代方案(Best HTTP2无法解决时)

1. 使用适配WebGL的Socket.IO v2 C#客户端

选择专门针对Unity WebGL优化的Socket.IO v2原生C#库,这类库会自动适配WebGL环境的序列化逻辑,确保emit发送的是JSON对象而非字符串。示例代码:

var socket = IO.Socket("http://your-server-url");
socket.On(Socket.EVENT_CONNECT, () => {
    // 直接传递匿名对象或自定义类实例
    socket.Emit("test-event", new { user_id = 456, message = "hello server" });
});

2. 手动实现Socket.IO v2协议(基于XHR轮询)

Socket.IO v2在WebSocket不可用时会降级为XHR轮询,可手动实现这套协议逻辑:

  • 第一步:发送GET请求完成握手,获取sid与连接参数。
  • 第二步:通过POST请求发送数据,用Json.NET将C#对象序列化为JSON(不转成字符串包裹),设置请求头Content-Type: application/json,按照Socket.IO的数据包格式封装后发送。
  • 第三步:定时发送心跳包维持连接状态。

内容的提问来源于stack exchange,提问作者user23621572

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 23:53:25