问题是socket.io v1.0.x修改了它的传输层。在 0.9.x 中,socket.io 首先尝试建立 websocket 连接,如果 websocket 被阻止、超时等,则回退到轮询。因此,您可以从以下位置下载 websocket 配置字符串,如“sid:interval_time:timeout_time:...” schema://addr:port/socket.io/1/。
然而,在v.1.0.x中,客户端必须首先建立广泛支持的轮询传输,然后升级到websocket。传输配置通过以下格式采用 json 格式:schema://addr:port/socket.io/?transport=polling。 json 对象看起来像 {"sid":"xxx", "upgrade":["websocket",..],"pingInterval":xxx,"pingTimeout":xxx}。
因此任何适用于 v0.9.x 的客户端都无法与 v1.0.x 通信。 elephant.io 有一个临时修复:https://github.com/Wisembly/elephant.io/pull/53/files#diff-8f2bc4c2d1b3889bc393b67f296edbc5R97。但是我无法让它工作。
想必现在所有 socket.io v1.0.x 的第 3 方客户端都是其 JavaScript 代码的完整端口。我尝试根据上面的elephant.io帖子修复socketio4net,但失败了。
更新于 08/26。
这是我得到的:
如何与socket.io v1.0服务器通信:
获取 http[s]://host:port/socket.io/?transport=polling
-
服务器在响应正文中响应 JSON 配置字符串,并使用一些未知字符作为标头。
针对 c 风格 char* 用户的警告:此字符串以 '\0' 开头。
该字符串如下所示: \0xxxx {"sid":"xxx", "upgrades":["websocket","polling",..], pingInterval:xxxx, pingTimeout:xxxx}。
sid:WebSocket 连接的会话 ID。
upgrades:可用的运输方式。请确保“websocket”是其中之一。
ping 间隔 & ping 超时:每个 pingInterval ping 服务器并在 pingTimeout 内检查 pong。
在 ws[s]://host:port/socket.io/?transport=websocket&sid= 建立 websocket 连接sid
连接成功后发送字符串“52”到socket.io服务器。
监听服务器消息,等待字符串“40”来确认客户端和服务器之间的 websocket 链接。
发送您在服务器上设置的任何其他命令。
Note:
v1.0将其消息传输格式更改为engine.io_type + socket.io_type + real_message_in_json。 (我不知道 v0.9 中的端点在哪里起作用。)
engine.io 消息类型:
- 打开=0
- 关闭=1
- 平=2
- 乒乓=3
- 消息=4
- 升级=5
- 无操作=6
socket.io消息类型:
- 连接=0
- 断开连接 = 1
- 事件 = 2
- 确认=3
- 错误=4
- 二进制事件 = 5
- 二进制确认=6
因此,“52”表示 UPGRADE_EVENT,“40”表示 MESSAGE_CONNECT。通常,服务器消息以“42”开头,即MESSAGE_EVENT。 PING 和 PONG 不需要 socket.io 消息。我想知道升级是否也是如此。
获得一个可用的 websocket 客户端,就可以开始了!
附: elephant.io 3.0 即将推出,支持 v1.0。