socket.io握手返回错误“;运输未知“;

socket.io握手返回错误“;运输未知“;,socket.io,handshake,Socket.io,Handshake,我正在尝试使用将事件从PHP脚本发送到nodejs服务器。 使用这个库执行测试时,我注意到握手并没有按预期进行 在使用socket.io之后,我测试了对我的nodejs服务器的一个简单握手请求: POST "http://acme.local:3700/socket.io/1" 但这将返回以下JSON消息: { "code": 0, "message": "Transport unknown" } 我不确定此错误是由于我正在使用的socket.io版本(v1.0.2)引起的,

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

在使用socket.io之后,我测试了对我的nodejs服务器的一个简单握手请求:

POST "http://acme.local:3700/socket.io/1"
但这将返回以下JSON消息:

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

我不确定此错误是由于我正在使用的socket.io版本(v1.0.2)引起的,还是握手请求的格式不正确。

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

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

问题在于socket.iov1.0.x对其传输层进行了改进。在0.9.x中,socket.io首先尝试建立websocket连接,然后在websocket被阻止、超时等情况下返回轮询。因此,您可以从中下载websocket配置字符串,如“sid:interval\u time:timeout\u 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有一个临时修复程序:。但是我不能让它工作

现在所有socket.iov1.0.x的第三方客户机都是JavaScript代码的完整端口。我试图根据上面的elephant.io帖子修复socketio4net,但失败了

更新日期:08/26

以下是我得到的:

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

  • 获取http[s]://主机:端口/socket.io/?传输=轮询

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

    c-style char*用户警告:此字符串以“\0”开头

    字符串如下所示:\0xxxx{“sid”:“xxx”,“upgrades”:[“websocket”,“polling”,…],pingInterval:xxxx,pingTimeout:xxxx}

    sid:请参阅websocket连接的版本id

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

    pingIntervalpingTimeout:为服务器ping每个pingInterval,并在pingTimeout内检查是否有pong

  • 在ws[s]上建立websocket连接://主机:端口/套接字。io/?传输=websocket&sid=sid

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

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

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

  • 注意

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

    engine.io消息类型:

    • 开放=0
    • 关闭=1
    • ping=2
    • pong=3
    • 消息=4
    • 升级=5
    • noop=6
    socket.io消息类型:

    • 连接=0
    • 断开连接=1
    • 事件=2
    • 确认=3
    • 误差=4
    • 二进制事件=5
    • 二进制应答=6
    所以,“52”表示升级事件,“40”表示消息连接。通常,服务器消息以“42”开头,这是消息事件。乒乓球不需要socket.io消息。我不知道升级是否也像这样工作

    获得一个工作的websocket客户端,您就可以开始了


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

    我建议您看看他们比meHi更进一步的地方。我已经尝试了您的建议。我已建立连接,但无法在服务器上触发事件。我用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服务器配合使用。