最近看了一一个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;
}
}
看样子这个协议不是websocket的协议,
没有必要去完全理解别人的协议,有时只有协议的制定者才能知道如果解析这个协议。
首先这个协议是用16进制明文传递的
使用$msg = unpack('H*',$str); 转换成了原始请求数据
首部两个字节是head,存储的应该是一个short int型数字,第三到第四字节也是一个short int,存储的是包长,下面的如果包长为ff或者fe分别有不同的解法....
再问一个问题,html5默认的websocket是用16进制的ACSII码发送数据的吗?
不是吧
哦,好的,我再看下,多谢!