1

我正在尝试对将使用 websockets 发送到浏览器的数据进行编码。我以本教程为基础:

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

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

    return $header.$text;
}

谁能告诉我这个功能有什么问题,因为我没有在网络浏览器中获得任何数据。
我在这条线上使用它:

    $msg = $this->encode($msg);

    parent::send($client,$msg);

PS:我不擅长二元动作。

4

3 回答 3

1

我解决了。if 语句是错误的。他们应该是这样的:

    if($length <= 125)
        $header = pack('CC', $b1, $length);
    elseif($length > 125 && $length < 65536)
        $header = pack('CCS', $b1, 126, $length);
    elseif($length >= 65536)
        $header = pack('CCN', $b1, 127, $length);
于 2013-01-25T22:14:50.910 回答
1

我最初使用相同的代码对我的 WebSocket 脚本中的数据进行编码,即使您进行了更正,它在某些情况下也不起作用。问题是有效载荷(数据)的长度没有正确计算。换句话说,您不能只使用 strlen 函数。

有关如何解决此问题的详细信息,请参阅我的相关帖子:WebRTC 候选人信息末尾的这些数据是什么?

于 2013-01-26T04:00:05.057 回答
1

Dharman 更正了超过 125 个字符的字符串的 if 语句失败。正确的 if 语句是:

    if($length <= 125) {
        $header = pack('CC', $b1, $length);
    } elseif ($length > 125 && $length < 65536) {
        $header = pack('CSC', $b1, 126, $length);
    } elseif ($length >= 65536) {
        $header = pack('CNC', $b1, 127, $length);
    }
于 2019-03-17T02:22:29.233 回答