3

私は websockets (RFC 6455) に基づいたアプリを書いています。残念ながら、クライアント (Chrome 18 でテスト中) はデータを受信して​​いないように見えますが、サーバーは送信していると言っています...

クロムは何も言わない

主なサーバー メソッドは次のとおりです。

private function decode($payload) {
    $length = ord($payload[1]) & 127;

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

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

    $text = base64_decode($text);
    return $text;
}

private function encode($text) {
    $text = base64_encode($text);
    // 0x1 text frame (FIN + opcode)
    $b1 = 0x80 | (0x1 & 0x0f);
    $length = strlen($text);

    if ($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif ($length > 125 && $length < 65536)
        $header = pack('CCS', $b1, 126, $length);
    else 
        $header = pack('CCN', $b1, 127, $length);

    return $header . $text;
} 

protected function process($user, $msg) {
    echo '<< '.$msg.N;
    if (empty($msg)) {
        $this->send($user->socket, $msg);
        return;
    }
}

protected function send($client, $msg) {
    $msg = $this->encode($msg);
    echo '>> '.$msg.N;
    socket_write($client, $msg, strlen($msg));
}
4

1 に答える 1

1

125 バイトを超えるが 65536 バイト未満のテスト メッセージを送信している場合、パックするフォーマット文字列の誤りが問題の原因である可能性があります。これは「CCn」にする必要があると思います(現在のコードでは、長さの 2 バイトが間違った順序で書き込まれています)。

それでも解決しない場合は、クライアント側のログを試すことができます。

  • 最初のハンドシェイクが正常に完了したことを証明するために onopen コールバックが実行されますか?
  • onerror または onclose コールバックは、接続後またはサーバーがメッセージを送信した後に実行されますか?
于 2012-05-30T09:26:42.543 に答える