编码要发送的数据的Websockets

时间:2013-01-25 21:51:14

标签: php websocket

我正在尝试使用websockets对我将发送到浏览器的数据进行编码。我的基础是this tutorial

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:我对二元行动并不擅长。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:1)

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

有关如何解决此问题的详细信息,请参阅我的相关帖子:What is this data at the end of WebRTC candidate info?

答案 2 :(得分:1)

Dharman更正了if语句对于超过125个字符的字符串失败的问题。正确的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);
    }