websocket 发送给我们的数据是经过掩码处理的(百度这么说的!)。反正不能直接获取。否则乱码。给websocket发送数据也是一样。
这里贴一些这两个方法。(来源百度,亲测没有问题)。
这两个方法是怎么实现的原理的,我是看不清楚。。。
解码
/* 对websocket传输过来的数据解码。你无需理解,照搬就可以。 */ private function decode($received){ $len = $masks = $data = $decoded = null; $buffer = $received; $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]; } return $decoded; }
编码
/* 对传输给websocket的数据编码。你无需理解,照搬就可以。 */ private function encode($msg){ if (!is_scalar($msg)) { print_r("只允许发送标量数据"); } // 数据长度 $len = strlen($msg); // 这边仅实现传输文本帧!第一个字节,文本帧 1000 0001 => 129 // 如果需要例如二进制帧,用于传输大文件,请另行实现 $first_byte = chr(129); if ($len <= 125) { // payload length = 7bit 支持的最大范围! $second_byte = chr($len); } else { if ($len <= 65535) { // payload length = 7 , extended payload length = 16bit,支持的最大范围 65535 // 最后16bit 被解释为无符号整数,排序为:大端字节序(网络字节序) $second_byte = chr(126) . pack('n' , $len); } else { // payload length = 7,extended payload length = 64bit // 最后 64 位被解释为无符号整数,大端字节序(网络字节序) $second_byte = chr(127) . pack('J' , $len); } } // 注意了,发送给客户端的数据不需要处理 // 详情查看 websocket 文档!! $encoded_data = $first_byte . $second_byte . $msg; // 这个就是发送给客户端的数据! return $encoded_data; }