socket.io v2客户端连v3/v4服务器

文章讨论了BestHTTPv1客户端在连接socket.iov3/v4服务器时遇到的问题,提出通过设置服务端的allowEIO3选项、升级BestHTTP版本或使用不同版本的socket.io来解决。还提到了TypeScript在服务端的使用注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一般在客户端非浏览器环境/node.js等会遇到这样的情况,需要socket.io v2客户端(常见于Unity中的BestHTTP)连v3/v4服务器。但是由于v3的断代性变化,导致连不上。

先说结论:v2版客户端连接v3/v4服务器不需要客户端做什么,仅需服务端开启allowEIO3: true选项。但用BestHTTP的情况又不一样。

BestHTTP连socket.io服务器

BestHTTP v1中的socket.io v2客户端连v3/v4服务器一般会出现如下错误(Unity Editor中):

Ex [PollingTransport]: ParseResponse - Message: 1: Index and count must refer to a location within the buffer.
Parameter name: bytes   at System.Text.UTF8Encoding.GetString (System.Byte[] bytes, System.Int32 index, System.Int32 count) [0x00057] in <695d1cc93cca45069c528c15c9fdd749>:0 
  at BestHTTP.SocketIO.Transports.PollingTransport.ParseResponse (BestHTTP.HTTPResponse resp) [0x000e5]

解决方案:

(1)客户端采用BestHTTP v1,用其中的socket.io v2:服务端只能用socket.io v2。但由于socket.io直到v3开始才给出TypeScript的类型声明,故服务端要使用TypeScript,只能把socket.io v2的变量声明成any类型。自己搞v2的.d.ts,工作量太大,如果你搞出来了,经测试没有问题,可以考虑共享到npm @type。

(2)客户端升级BestHTTP v1到v2,但是仍然用其中的socket.io v2。服务端可以用socket.io v2/v3/v4,v3/v4要开启allowEIO3: true。

(3)客户端直接用BestHTTP v2中的socket.io v3/v4,一切OK。

我不确定是否所有BestHTTP v1都无法正常连接开启allowEIO3: true选项的socket.io v3/v4服务器,但是至少到BestHTTP v1.10.x都不能连上,尽管它们号称支持socket.io v2。

v3/v4服务器开启allowEIO3: true选项

非常简单,在require socket.io的时候按如下方法开启:

var io = require('socket.io')(http, {
    allowEIO3: true // false by default
  });

参考

Migrating from 2.x to 3.0 | Socket.IO

https://benedicht.github.io/BestHTTP-Documentation/pages/best_http2/protocols/socketio/socketio.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值