0

RFC 6455 仕様をサポートする Web ソケット サーバーが見つからなかったため、PHP で Web ソケット サーバーをプログラミングしています。その際、phpwebsocketのコードをベースに RFC 6455 対応にしました。少なくとも、メッセージの受信部分については行いました。メッセージをサーバーに送り返そうとするたびに、さまざまなメッセージが返されます。これは、ビットマスキングのスキルが...ひどいためだと確信しています。そのため、かなりの試行錯誤の後、私はまだこの問題を抱えており、その理由はわかりません.

  Time                     OpCode Mask Length Data
1>2012-06-25T18:05:58.014Z 1      true 4      Ping
2>2012-06-25T18:06:02.121Z 1      true 5      hello
3 2012-06-25T18:06:02.121Z A server must not mask any frames that it sends to the server.

また

3 2012-06-25T18:06:02.121Z Unexpected continuation frame.

コマンドラインインターフェイスを使用して、コンピューターでPHP 5.4.4を使用しています。php ws.phpWeb ソケット サーバーを起動するために必要な作業はこれだけです。次にwsClient.html、をクライアントとして使用します。Windows 8 Preview で最新バージョンの Google Chrome (21.0.1180.4 dev-m) を使用すると、次のメッセージが表示されます。

私のgithub リポジトリから php サーバーとクライアントをダウンロードして、そこから長時間プレイすることができます。問題はWebSockets::send関数にあります。

private function send($client, $payload)
{
    $frame = pack('C2a*', 0b10000001, 0b01111111 & strlen($payload), $payload);
    socket_write($client, $frame, strlen($frame));
}

私は何を間違っていますか?

4

2 に答える 2

0

このメッセージは、ブラウザがテキストフレーム(オペコードの場合は1)ではなく継続フレーム(オペコードの場合は0)を取得していることを意味します。パック機能が思ったように機能していないと思います。私はPHPの専門家ではありませんが、おそらくこのようなものがあなたの意図したものです。

$plen = strlen($payload);
$frame = pack('CCa{$plen}', ...

また、ペイロードが125バイトより長い場合、ペイロードの長さの計算は失敗します。126〜65535バイトのペイロードの場合、ヘッダーの3番目と4番目のバイトに長さを入れる必要があります。65536以降のペイロッドの場合、ペイロードの長さをヘッダーの3番目から10番目のバイトに入れる必要があります(ヘッダーの長さはペイロードの長さによって異なります)。

于 2012-06-25T19:01:14.127 に答える
0

私の問題は、バイナリ構文を使用するときに、ビッグエンディアンスタイルではなくリトルエンディアンスタイルを使用していたことでした。やる0b10000001, 0b01111111べきときにやってい0b10000001, 0b11111110た。

于 2012-07-12T09:32:06.060 に答える