带有hybi-17的HTML5 WebSocket

时间:2011-10-30 13:01:49

标签: html5 websocket handshake phpwebsocket

更新:我解决了解码问题,感谢 pimvdb

遵循解决方案(在PHP中):

$len = $masks = $data = $decoded = null;

$len = ord ($buffer[1]) & 127;

if ($len === 126) {
  $masks = substr ($buffer, 4, 4);
  $data = substr ($buffer, 8);
}
else if ($len === 127) {
  $masks = substr ($buffer, 10, 4);
  $data = substr ($buffer, 14);
}
else {
  $masks = substr ($buffer, 2, 4);
  $data = substr ($buffer, 6);
}

for ($index = 0; $index < strlen ($data); $index++) {
  $decoded .= $data[$index] ^ $masks[$index % 4];
}

*原始主题的开头*

我正在尝试使用 hybi-17 handshake 为个人应用程序开发HTML5 WebSocket。

我从 phpwebsocket 开始,我唯一改变的是握手功能,从原始到此:

function dohandshake($user,$buffer){
  $key = null;

  console("\nRequesting handshake...");
  console($buffer);
  console("Handshaking...");

  preg_match ("#Sec-WebSocket-Key: (.*?)\r\n#", $buffer, $match) && $key = $match[1];

  $key .= "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
  $key = sha1 ($key);
  $key = pack ('H*', $key);
  $key = base64_encode ($key);

  $upgrade = 
    "HTTP/1.1 101 Switching Protocols\r\n" .
    "Upgrade: websocket\r\n" .
    "Connection: Upgrade\r\n" .
    "Sec-WebSocket-Accept: {$key}\r\n\r\n";

  socket_write($user->socket,$upgrade.chr(0),strlen($upgrade.chr(0)));
  $user->handshake=true;
  console($upgrade);
  console("Done handshaking...");
  return true;
}

我使用了phpwebsocket源代码,两者都用于客户端(http://code.google.com/p/phpwebsocket/source/browse/trunk/+phpwebsocket/client.html)和服务器(http://code.google.com/p/phpwebsocket/source/browse/trunk/+phpwebsocket/server.php)。

此时,我测试了该应用程序。遵循服务器调试:

Server Started : 2011-10-30 13:45:41
Master socket  : Resource id #4
Listening on   : localhost port 12345

Resource id #5 CONNECTED!

Requesting handshake...
GET /phpwebsocket/server.php HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:12345
Sec-WebSocket-Origin: http://localhost
Sec-WebSocket-Key: +S/J2jcp/UKIS1HTW0n1/w==
Sec-WebSocket-Version: 8


Handshaking...
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: LEULWidwXDxY02iv3O+xksrxFz4=


Done handshaking...
< ��z�}p
> ��z�}p not understood
Resource id #5 DISCONNECTED!  

这是客户端调试:

WebSocket - status 0
Welcome - status 1
Sent: hello
Disconnected - status 3

我所做的只是连接客户端并发送命令'Hello'。 如您所见,服务器接收到编码数据而不是明文:为什么?

我正在寻找帮助我用hybi-17开发html5 websocket的人。

Cyaz

PS:这个(http://stackoverflow.com/questions/7908306/implementing-handshake-for-hybi-17)主题和这个(http: //stackoverflow.com/questions/7912772/decoding-network-chars-html5-websocket)可能会有所帮助。

PPS:我测试了 Chromium 15 .0.874.106~r107270-0ubuntu0.11.04.1

2 个答案:

答案 0 :(得分:1)

解码解决方案(感谢@pimvdb):

$len = $masks = $data = $decoded = null;

$len = ord ($buffer[1]) & 127;

if ($len === 126) {
  $masks = substr ($buffer, 4, 4);
  $data = substr ($buffer, 8);
}
else if ($len === 127) {
  $masks = substr ($buffer, 10, 4);
  $data = substr ($buffer, 14);
}
else {
  $masks = substr ($buffer, 2, 4);
  $data = substr ($buffer, 6);
}

for ($index = 0; $index < strlen ($data); $index++) {
  $decoded .= $data[$index] ^ $masks[$index % 4];
}

答案 1 :(得分:0)

这个编码功能很棒,只是chrome 19不像被屏蔽的数据。将第一条消息发送到服务器后,我收到此错误: &#34;服务器不得屏蔽它发送给客户端的任何帧。&#34;

我找不到如何不屏蔽发送到服务器的数据,直到我找到一个有效的github示例并且有一个标志可以设置为不屏蔽数据帧。 https://github.com/lemmingzshadow/php-websocket

我找到了phpwebsocket代码的这个更新版本: http://www.wilky.it/phpwebsocket-new-version/ 要使其工作,您需要修复的一件事是在第234行替换此行: preg_match(&#34;#Sec-WebSocket-Origin:(。*?)\ r \ n#&#34;,$ buffer,$ match)&amp;&amp; $ origin = $ match [1]; 同 preg_match(&#34; #Origin:(。*?)\ r \ n#&#34;,$ buffer,$ match)&amp;&amp; $ origin = $ match [1];

然后修复chrome中的错误:&#34;服务器不得屏蔽它发送给客户端的任何帧。&#34;请执行下列操作: 我修复了用lemmingzshadow&#39; s github中的connection.php文件中的一个替换了编码函数,它开始工作了。该函数名为:\ server \ lib \ WebSocket \ connection.php文件中的hybi10Encode。 在函数encode中更改此参数:$ masked = true to $ masked = false 所以我们现在有2个版本可以在chrome和firefox 12中使用!