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 =6socket.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 标头添加到握手的响应中。错误或配置错误?