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

时间:2014-06-02 05:06:42

标签: socket.io handshake

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

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

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

但这会返回以下JSON消息:

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

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

3 个答案:

答案 0 :(得分:14)

问题是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",..],&#34 ; 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",&# 34; 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

  4. 建立websocket连接
  5. 发送字符串" 52"成功连接后到socket.io服务器。

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

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

  8. 注意

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

    engine.io消息类型:

    • open = 0
    • close = 1
    • ping = 2
    • pong = 3
    • message = 4
    • 升级= 5
    • noop = 6

    socket.io消息类型:

    • connect = 0
    • disconnect = 1
    • event = 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客户端,你很高兴!

    P.S。 elephant.io 3.0即将推出,它支持v1.0。

答案 1 :(得分:3)

还原到socket.io v0.9.x可以解决问题。 显然握手在v1.0.x中发生了变化,但我找不到任何文件

答案 2 :(得分:0)

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