关于WEBSOKET协议的数据解析的疑问

HappyLiu

最近看了一一个PHP SOCKET服务端代码,对于其中对SOKET协议的数据解析部分看不明白,就是以下代码中的uncode方法;希望知道的牛人解答下,谢谢!附件中有相关客户端和服务端代码!

function uncode($str,$key){
        $mask = array();  
        $data = '';
        $msg = unpack('H*',$str);
        // print_r($msg); echo "\r\n";
        $head = substr($msg,0,2);  
        if ($head == '81' && !isset($this->slen)) {  
            $len=substr($msg,2,2);
            $len=hexdec($len);
            if(substr($msg,2,2)=='fe'){
                $len=substr($msg,4,4);
                $len=hexdec($len);
                $msg=substr($msg,4);
            }else if(substr($msg,2,2)=='ff'){
                $len=substr($msg,4,16);
                $len=hexdec($len);
                $msg=substr($msg,16);
            }
            $mask[] = hexdec(substr($msg,4,2));  
            $mask[] = hexdec(substr($msg,6,2));  
            $mask[] = hexdec(substr($msg,8,2));  
            $mask[] = hexdec(substr($msg,10,2));
            $s = 12;
            $n=0;
        }else if($this->slen > 0){
            $len=$this->slen;
            $mask=$this->ar;
            $n=$this->n;
            $s = 0;
        }

        $e = strlen($msg)-2;
        for ($i=$s; $i<= $e; $i+= 2) {  
            $data .= chr($mask^hexdec(substr($msg,$i,2)));  
            $n++;  
        }  
        $dlen=strlen($data);

        if($len > 255 && $len > $dlen+intval($this->sjen)){
            $this->ar=$mask;
            $this->slen=$len;
            $this->sjen=$dlen+intval($this->sjen);
            $this->sda=$this->sda.$data;
            $this->n=$n;
            return false;
        }else{
            unset($this->ar,$this->slen,$this->sjen,$this->n);
            $data=$this->sda.$data;
            unset($this->sda);
            return $data;
        }

    }
5457 2 0
2个回答

walkor 打赏

看样子这个协议不是websocket的协议,
没有必要去完全理解别人的协议,有时只有协议的制定者才能知道如果解析这个协议。

首先这个协议是用16进制明文传递的
使用$msg = unpack('H*',$str); 转换成了原始请求数据
首部两个字节是head,存储的应该是一个short int型数字,第三到第四字节也是一个short int,存储的是包长,下面的如果包长为ff或者fe分别有不同的解法....

  • HappyLiu 2014-08-28

    再问一个问题,html5默认的websocket是用16进制的ACSII码发送数据的吗?

  • walkor 2014-08-28

    不是吧

HappyLiu

哦,好的,我再看下,多谢!

  • 暂无评论
年代过于久远,无法发表回答
×
🔝