HTML5 WebSocket с Hybi-17 - PullRequest
       34

HTML5 WebSocket с Hybi-17

1 голос
/ 30 октября 2011

Обновление : Я решил проблему с декодированием, благодаря 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];
}

* Начало исходной темы *

Я пытаюсь разработать HTML5 WebSocket для персонального приложения, используя рукопожатие hybi-17 .

Я начал с 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;
}

Iиспользовал исходный код 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». Как видите, сервер получил закодированные данные ине открытым текстом: почему?

Я ищу человека, который поможет мне разработать веб-сокет html5 с помощью hybi-17.

Cyaz

PS: эта (/4446935/realizatsiya-rukopozhatiya-dlya-hybi-17) тема и эта (/4629364/rasshifrovka-setevyh-simvolov-html5-websocket) может помочь.

PPS: я тестировал Chromium 15 .0.874.106~ r107270-0ubuntu0.11.04.1

Ответы [ 2 ]

1 голос
/ 24 мая 2012

Решение для декодирования (благодаря @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];
}
0 голосов
/ 30 июня 2012

Эта функция кодирования великолепна, за исключением того, что chrome 19 не нравится маскируемая информация. Я получаю эту ошибку после отправки первого сообщения на сервер: «Сервер не должен маскировать кадры, отправляемые клиенту.»

Я не мог понять, как не маскировать данные, отправляемые на сервер, пока не нашел пример github, который работает и имеет флаг, который можно установить, чтобы не маскировать фреймы данных. https://github.com/lemmingzshadow/php-websocket

Я нашел эту обновленную версию кода phpwebsocket: http://www.wilky.it/phpwebsocket-new-version/ Единственное, что вам нужно исправить, чтобы это заработало, это заменить строку в строке 234: preg_match ("# Sec-WebSocket-Origin: (. *?) \ r \ n #", $ buffer, $ match) && $ origin = $ match [1]; с preg_match ("#Origin: (. *?) \ r \ n #", $ buffer, $ match) && $ origin = $ match [1];

Затем, чтобы исправить ошибку в chrome: «Сервер не должен маскировать любые кадры, которые он отправляет клиенту». сделайте следующее: Я исправил замененную функцию кодирования на функцию в файле connection.php в github lemmingzshadow, и она начала работать. Функция называется: hybi10Encode в файле \ server \ lib \ WebSocket \ connection.php. измените этот параметр в функции encode: $ masked = true на $ masked = false Итак, у нас есть 2 версии, которые работают сейчас в Chrome и Firefox 12!

...