概述
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
$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;
}
最后
以上就是失眠电脑为你收集整理的php websocket发送二进制数据,socket 如何解码websocket发送过来的数据 和 编码数据在发送给websocket...的全部内容,希望文章能够帮你解决php websocket发送二进制数据,socket 如何解码websocket发送过来的数据 和 编码数据在发送给websocket...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复