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

max*_*022 9 handshake socket.io

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

阅读了有关 socket.io的客户端 - 服务器握手的规范之后,我测试了一个简单的握手请求到我的nodejs服务器:

POST "http://acme.local:3700/socket.io/1"
Run Code Online (Sandbox Code Playgroud)

但是这会返回以下JSON消息:

{
    "code": 0,
    "message": "Transport unknown"
}
Run Code Online (Sandbox Code Playgroud)

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

neu*_*ino 14

问题是socket.io v1.0.x改进了它的传输层.在0.9.x中,socket.io首先尝试建立一个websocket连接,如果websocket被阻止,超时等,则回退到轮询.所以你可以从"sid:interval_time:timeout_time:..."下载一个websocket配置字符串.模式://地址:端口/ 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的所有第三方客户端现在都是其JavaScript代码的完整端口.我试图根据上面的elephant.io帖子修复socketio4net,但失败了.

08/26更新.

这是我得到的:

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

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

  2. 服务器在响应正文中响应JSON配置字符串,并将一些未知字符作为标头.

    c-style char*useres的警告:此字符串以'\ 0'开头.

    该字符串看起来像:\ 0xxxx {"sid":"xxx","升级":["websocket","polling",..],pingInterval:xxxx,pingTimeout:xxxx}.

    sid:websocket连接的seesion id.

    升级:可用的运输方式.请确保"websocket"就是其中之一.

    pingInterval&pingTimeout:ping每个pingInterval服务器并检查pingTimeout中的pong.

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

  4. 成功连接后,将字符串"52"发送到socket.io服务器.

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

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

注意:

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

engine.io消息类型:

  • 开= 0
  • close = 1
  • ping = 2
  • 乒乓球= 3
  • 消息= 4
  • 升级= 5
  • noop = 6

socket.io消息类型:

  • connect = 0
  • disconnect = 1
  • 事件= 2
  • ack = 3
  • 错误= 4
  • binary_event = 5
  • binary_ack = 6

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

获得一个有效的websocket客户端,你很高兴!

PS elephant.io 3.0即将推出,支持v1.0.


max*_*022 3

恢复到 socket.iov0.9.x可以解决该问题。显然握手方式发生了变化,v1.0.x但我还找不到任何文档