php websocket发送二进制数据,socket 如何解码websocket发送过来的数据 和 编码数据在发送给websocket...

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值