我正在尝试使用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)或者握手请求是否格式错误。
答案 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服务器通信:
GET http [s]:// host:port / socket.io /?transport = polling
服务器在响应正文中响应一个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。
在ws [s]:// host:port / socket.io /?transport = websocket& sid = sid
发送字符串" 52"成功连接后到socket.io服务器。
收听服务器消息,等待字符串" 40"确认客户端和服务器之间的websocket链接。
发送您在服务器上设置的任何其他命令。
注意强>:
v1.0将其消息传输格式更改为engine.io_type + socket.io_type + real_message_in_json。 (我不知道v0.9中的端点在哪里开始。)
engine.io消息类型:
socket.io消息类型:
所以," 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'});