socket.io 握手返回错误“传输未知”

2023-11-26

我正在尝试使用大象io将事件从我的 PHP 脚本发送到我的 Nodejs 服务器。 使用这个库进行测试时,我注意到握手没有按预期发生。

After 阅读有关客户端-服务器握手的规范使用socket.io,我测试了对我的nodejs服务器的简单握手请求:

POST "http://acme.local:3700/socket.io/1"

但这会返回以下 JSON 消息:

{
    "code": 0,
    "message": "Transport unknown"
}

我不确定此错误是否是由于我使用的 socket.io 版本(v1.0.2)造成的,或者握手请求是否只是格式错误。


问题是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服务器通信:

  1. 获取 http[s]://host:port/socket.io/?transport=polling

  2. 服务器在响应正文中响应 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。

  3. 在 ws[s]://host:port/socket.io/?transport=websocket&sid= 建立 websocket 连接sid

  4. 连接成功后发送字符串“52”到socket.io服务器。

  5. 监听服务器消息,等待字符串“40”来确认客户端和服务器之间的 websocket 链接。

  6. 发送您在服务器上设置的任何其他命令。

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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

socket.io 握手返回错误“传输未知” 的相关文章