1

更新: 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ハンドシェイクを使用して、個人用アプリケーション用のHTML5WebSocketを開発しようとしています。

私は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;
}

クライアントhttp://code.google.com/p/phpwebsocket/source/browse/trunk/+phpwebsocket/client.html)とサーバー( http://code.google)の両方にphpwebsocketソースコードを使用しました。 com / p / phpwebsocket / source / browser / 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を使用してhtml5WebSocketを開発するのを手伝ってくれる人を探しています。

Cyaz

PS:thishybi-17のハンドシェイクの実装)トピックとthisDecoding network chars(HTML5 Websocket))が役立つかもしれません。

PPS:Chromium 15 .0.874.106〜r107270-0ubuntu0.11.04.1でテストしました

4

2 に答える 2

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];
}
于 2012-05-24T19:05:11.420 に答える
0

このエンコード機能は、chrome19がマスクされているデータを好まないことを除いて優れています。サーバーに最初のメッセージを送信した後、このエラーが発生します。「サーバーは、クライアントに送信するフレームをマスクしてはなりません。」

動作し、データフレームをマスクしないように設定できるフラグを持つ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]; with preg_match( "#Origin:(。*?)\ r \ n#"、$ buffer、$ match)&& $ origin = $ match [1];

次に、chromeのエラーを修正します。「サーバーは、クライアントに送信するフレームをマスクしてはなりません。」次の手順を実行します。エンコード関数をlemmingzshadowのgithubのconnection.phpファイルにあるものに置き換えて修正すると、機能し始めました。この関数は、\ server \ lib \ WebSocket\connection.phpファイルのhybi10Encodeと呼ばれます。関数encodeでこのパラメーターを変更します。$masked=trueから$masked= falseしたがって、chromeとfirefox12で動作する2つのバージョンがあります。

于 2012-06-30T05:43:49.393 に答える