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

Posted

技术标签:

【中文标题】socket.io 握手返回错误“传输未知”【英文标题】:socket.io handshake return error "Transport unknown" 【发布时间】:2014-07-22 03:56:12 【问题描述】:

我正在尝试使用 elephant.io 将事件从我的 php 脚本发送到我的 nodejs 服务器。 用这个库执行测试我注意到握手没有按预期发生。

reading the specs about client-server handshake 使用 socket.io 之后,我测试了一个对我的 nodejs 服务器的简单握手请求:

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

但这会返回以下 JSON 消息:


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

我不确定这个错误是由于我使用的 socket.io 版本 (v1.0.2) 还是握手请求格式错误。

【问题讨论】:

我建议你看看this github ticket,他们比我更进一步 【参考方案1】:

问题是 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 通信。大象.io 有一个临时修复:https://github.com/Wisembly/elephant.io/pull/53/files#diff-8f2bc4c2d1b3889bc393b67f296edbc5R97。但是我无法让它工作。

现在,socket.io v1.0.x 的所有 3rd 方客户端大概都是其 javascript 代码的完整端口。我尝试根据上面的elephant.io帖子修复socketio4net,但失败了。

08/26 更新。

这是我得到的:

如何与socket.io v1.0服务器通信:

    GET http[s]://host:port/socket.io/?transport=polling

    服务器在响应正文中响应一个 JSON 配置字符串,其中包含一些未知字符作为标头。

    针对 c 风格的 char* 用户的警告:此字符串以 '\0' 开头。

    字符串看起来像:\0xxxx "sid":"xxx", "upgrades":["websocket","polling",..], pingInterval:xxxx, pingTimeout:xxxx。

    sid:websocket 连接的seesion id。

    升级:可用的传输方式。请确保“websocket”是其中之一。

    pingInterval & pingTimeout:每个 pingInterval ping 服务器并在 pingTimeout 内检查 pong。

    在 ws[s]://host:port/socket.io/?transport=websocket&sid=sid

    建立 websocket 连接

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

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

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

注意

v1.0 将其消息传输格式更改为 engine.io_type + socket.io_type + real_message_in_json。 (我不知道 v0.9 中的端点在哪里起作用。)

engine.io 消息类型:

打开=0 关闭 =1 ping =2 乒乓=3 消息=4 升级=5 noop =6

socket.io 消息类型:

连接 = 0 断开连接 = 1 事件 = 2 确认 = 3 错误 = 4 binary_event = 5 binary_ack = 6

因此,“52”表示 UPGRADE_EVENT,“40”表示 MESSAGE_CONNECT。通常,服务器消息以“42”开头,即 MESSAGE_EVENT。 PING 和 PONG 不需要 socket.io 消息。我想知道 UPGRADE 是否也可以这样工作。

获取一个工作的 websocket 客户端,你就可以开始了!

附:大象.io 3.0 即将发布,支持v1.0。

【讨论】:

您好,我已经尝试了您的建议。我已建立连接,但无法在服务器上触发事件。我用 42 发送,但我认为服务器无法收到消息。 @Ozan 42 作为服务器理解您的消息的头代码。需要附加功能信息。例如:如果你正在使用的js代码是socket.emit('foo', 'bar');,你应该发送"42["foo", "bar"]"。祝你好运! 是的,你是对的。我只是无法为服务器提供正确的 json 格式。现在它工作正常。感谢您的回答。它对我的设置帮助太大了。这种 json 格式完美运行: 42["event","msg":"test"] 你太棒了!!您的详细回答非常有助于将标准 ratchetphp/Pawl websocket 客户端“升级”为 socket.io-websocket 客户端,该客户端非常适用于 socket.io-websocket 服务器。【参考方案2】:

我遇到了同样的问题,这是我的解决方案: io.connect('localhost', transport:'polling');

【讨论】:

【参考方案3】:

恢复到 socket.io v0.9.x 修复问题。 显然v1.0.x 中的握手发生了变化,但我还找不到任何文档

【讨论】:

以上是关于socket.io 握手返回错误“传输未知”的主要内容,如果未能解决你的问题,请参考以下文章

WebSocket 握手期间的 Socket.io 错误:意外的响应代码:500 windows server iis

NestJs Socket io 适配器:如果使用 false 调用 allowFunction,服务器不会将 CORS 标头添加到握手的响应中。错误或配置错误?

socket.io 和 node.js 400 错误请求

使用 Socket.IO 进行授权和握手

为啥我不断收到 Socket.io 轮询请求的 404 错误?

Socket.io - 失败:连接在收到握手响应之前关闭