博客列表 >socket 如何解码websocket发送过来的数据 和 编码数据在发送给websocket

socket 如何解码websocket发送过来的数据 和 编码数据在发送给websocket

有什么是忘不了的的博客
有什么是忘不了的的博客原创
2020年06月02日 22:45:232089浏览

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;
	}


声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议