当前位置:首页 > PHP教程 > php高级应用 > 列表

php+html5基于websocket实现聊天室的方法

发布:smiling 来源: PHP粉丝网  添加日期:2021-06-13 13:32:08 浏览: 评论:0 

这篇文章主要介绍了php+html5基于websocket实现聊天室的方法,实例分析了php结合html5的websocket通讯的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了php+html5基于websocket实现聊天室的方法,分享给大家供大家参考,具体如下:

html5的websocket 实现了双向通信,折腾了几天弄了个聊天室,分享给大家

  1. <?php 
  2. error_reporting(E_ALL); 
  3. ob_implicit_flush(); 
  4. $sk=new Sock('127.0.0.1',8000); 
  5. $sk->run(); 
  6. class Sock{ 
  7.  public $sockets
  8.  public $users
  9.  public $master
  10.  public function __construct($address$port){ 
  11.   $this->master=$this->WebSocket($address$port); 
  12.   $this->sockets=array('s'=>$this->master); 
  13.  } 
  14.  function run(){ 
  15.   while(true){ 
  16.    $changes=$this->sockets; 
  17.    socket_select($changes,$write=NULL,$except=NULL,NULL); 
  18.    foreach($changes as $sock){ 
  19.     if($sock==$this->master){ 
  20.      $client=socket_accept($this->master); 
  21.      //$key=uniqid(); 
  22.      $this->sockets[]=$client
  23.      $this->users[]=array
  24.       'socket'=>$client
  25.       'shou'=>false 
  26.      ); 
  27.     }else
  28.      $len=socket_recv($sock,$buffer,2048,0); 
  29.      $k=$this->search($sock); 
  30.      if($len<7){ 
  31.       $name=$this->users[$k]['ming']; 
  32.       $this->close($sock); 
  33.       $this->send2($name,$k); 
  34.       continue
  35.      } 
  36.      if(!$this->users[$k]['shou']){ 
  37.       $this->woshou($k,$buffer); 
  38.      }else
  39.       $buffer = $this->uncode($buffer); 
  40.       $this->send($k,$buffer); 
  41.      } 
  42.     } 
  43.    } 
  44.   } 
  45.  } 
  46.  function close($sock){ 
  47.   $k=array_search($sock$this->sockets); 
  48.   socket_close($sock); 
  49.   unset($this->sockets[$k]); 
  50.   unset($this->users[$k]); 
  51.   $this->e("key:$k close"); 
  52.  } 
  53.  function search($sock){ 
  54.   foreach ($this->users as $k=>$v){ 
  55.    if($sock==$v['socket']) 
  56.    return $k
  57.   } 
  58.   return false; 
  59.  } 
  60.  function WebSocket($address,$port){ 
  61.   $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); 
  62.   socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1); 
  63.   socket_bind($server$address$port); 
  64.   socket_listen($server); 
  65.   $this->e('Server Started : '.date('Y-m-d H:i:s')); 
  66.   $this->e('Listening on : '.$address.' port '.$port); 
  67.   return $server
  68.  } 
  69.  function woshou($k,$buffer){ 
  70.   $buf = substr($buffer,strpos($buffer,'Sec-WebSocket-Key:')+18); 
  71.   $key = trim(substr($buf,0,strpos($buf,"\r\n"))); 
  72.   $new_key = base64_encode(sha1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11",true)); 
  73.   $new_message = "HTTP/1.1 101 Switching Protocols\r\n"
  74.   $new_message .= "Upgrade: websocket\r\n"
  75.   $new_message .= "Sec-WebSocket-Version: 13\r\n"
  76.   $new_message .= "Connection: Upgrade\r\n"
  77.   $new_message .= "Sec-WebSocket-Accept: " . $new_key . "\r\n\r\n"
  78.   socket_write($this->users[$k]['socket'],$new_message,strlen($new_message)); 
  79.   $this->users[$k]['shou']=true; 
  80.   return true; 
  81.  } 
  82.  function uncode($str){ 
  83.   $mask = array();  
  84.   $data = '';  
  85.   $msg = unpack('H*',$str);  
  86.   $head = substr($msg[1],0,2);  
  87.   if (hexdec($head{1}) === 8) {  
  88.    $data = false;  
  89.   }else if (hexdec($head{1}) === 1){  
  90.    $mask[] = hexdec(substr($msg[1],4,2));  
  91.    $mask[] = hexdec(substr($msg[1],6,2));  
  92.    $mask[] = hexdec(substr($msg[1],8,2));  
  93.    $mask[] = hexdec(substr($msg[1],10,2));  
  94.    $s = 12;  
  95.    $e = strlen($msg[1])-2;  
  96.    $n = 0;  
  97.    for ($i=$s$i<= $e$i+= 2) {  
  98.     $data .= chr($mask[$n%4]^hexdec(substr($msg[1],$i,2))); 
  99.     $n++;  
  100.    }  
  101.   }  
  102.   return $data
  103.  } 
  104.  function code($msg){ 
  105.   $msg = preg_replace(array('/\r$/','/\n$/','/\r\n$/',), ''$msg); 
  106.   $frame = array();  
  107.   $frame[0] = '81';  
  108.   $len = strlen($msg);  
  109.   $frame[1] = $len<16?'0'.dechex($len):dechex($len);  
  110.   $frame[2] = $this->ord_hex($msg);  
  111.   $data = implode('',$frame);  
  112.   return pack("H*"$data);  
  113.  } 
  114.  function ord_hex($data) {  
  115.   $msg = '';  
  116.   $l = strlen($data);  
  117.   for ($i= 0; $i<$l$i++) {  
  118.    $msg .= dechex(ord($data{$i}));  
  119.   }  
  120.   return $msg;  
  121.  } 
  122.  function send($k,$msg){ 
  123.   /*$this->send1($k,$this->code($msg),'all');*/ 
  124.   parse_str($msg,$g); 
  125.   $this->e($msg); 
  126.   $ar=array(); 
  127.   if($g['type']=='add'){ 
  128.    $this->users[$k]['ming']=$g['ming']; 
  129.    $ar['add']=true; 
  130.    $ar['nrong']='欢迎'.$g['ming'].'加入!'
  131.    $ar['users']=$this->getusers(); 
  132.    $key='all'
  133.   }else if($g['type']=='ltiao'){ 
  134.    $ar['nrong']=$g['nr']; 
  135.    $key=$g['key']; 
  136.   } 
  137.   $msg=json_encode($ar); 
  138.   $this->e($msg); 
  139.   $msg = $this->code($msg); 
  140.   $this->send1($k,$msg,$key); 
  141.   //socket_write($this->users[$k]['socket'],$msg,strlen($msg)); 
  142.  } 
  143.  function getusers(){ 
  144.   $ar=array(); 
  145.   foreach($this->users as $k=>$v){ 
  146.    $ar[$k]=$v['ming']; 
  147.   } 
  148.   return $ar
  149.  } 
  150.  function send1($k,$str,$key='all'){ 
  151.   if($key=='all'){ 
  152.    foreach($this->users as $v){ 
  153.     socket_write($v['socket'],$str,strlen($str)); 
  154.    } 
  155.   }else
  156.    if($k!=$key
  157.    socket_write($this->users[$k]['socket'],$str,strlen($str)); 
  158.    socket_write($this->users[$key]['socket'],$str,strlen($str)); 
  159.   } 
  160.  } 
  161.  function send2($ming,$k){ 
  162.   $ar['remove']=true; 
  163.   $ar['removekey']=$k
  164.   $ar['nrong']=$ming.'退出聊天室'
  165.   $str = $this->code(json_encode($ar)); 
  166.   $this->send1(false,$str,'all'); 
  167.  } 
  168.  function e($str){ 
  169.   $path=dirname(__FILE__).'/log.txt'
  170.   $str=$str."\n"
  171.   error_log($str,3,$path); 
  172.   echo iconv('utf-8','gbk//IGNORE',$str); 
  173.  } 
  174. ?> 

希望本文所述对大家的php程序设计有所帮助。

Tags: php+html5 websocket

分享到: