PHP实时消息推送关于websocket技术-

PHP实时消息推送关于websocket技术- 什么是WebSocketWebSocket用于在W

PHP实时消息推送关于websocket技术-

什么是WebSocket

WebSocket用于在Web浏览器和服务器之间进行任意的双向数据传输的一种技术。WebSocket协议基于TCP协议实现,包含初始的握手过程,以及后续的多次数据帧双向传输过程。

其目的是在WebSocket应用和WebSocket服务器进行频繁双向通信时,可以使服务器避免打开多个HTTP连接进行工作来节约资源,提高了工作效率和资源利用率。

WebSocket 的一些特点:

  • 建立在 TCP 协议之上,服务器端的实现比较容易。
  • 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
  • 数据格式比较轻量,性能开销小,通信高效。
  • 可以发送文本,也可以发送二进制数据。
  • 没有同源限制,客户端可以与任意服务器通信。
  • 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

实现原理

浏览器发出webSocket的连线请求,服务器发出响应,这个过程称为握手,握手的过程只需要一次,就可以实现持久连接。

php实现websocket实时消息推送

这里封装了一个类,具体看SocketService.php文件

<?phpclassSocketService{private$address='0.0.0.0';private$port=8080;private$_sockets;publicfunction__construct($address='',$port=''){if(!empty($address)){$this->address=$address;}if(!empty($port)){$this->port=$port;}}publicfunctionservice(){//获取tcp协议号码。$tcp=getprotobyname("tcp");$sock=socket_create(AF_INET,SOCK_STREAM,$tcp);socket_set_option($sock,SOL_SOCKET,SO_REUSEADDR,1);if($sock<0){thrownewException("failedtocreatesocket:".socket_strerror($sock)."\\n");}socket_bind($sock,$this->address,$this->port);socket_listen($sock,$this->port);echo"listenon$this->address$this->port…\\n";$this->_sockets=$sock;}publicfunctionrun(){$this->service();$clients[]=$this->_sockets;while(true){$changes=$clients;$write=NULL;$except=NULL;socket_select($changes,$write,$except,NULL);foreach($changesas$key=>$_sock){if($this->_sockets==$_sock){//判断是不是新接入的socketif(($newClient=socket_accept($_sock))===false){die('failedtoacceptsocket:'.socket_strerror($_sock)."\\n");}$line=trim(socket_read($newClient,1024));$this->handshaking($newClient,$line);//获取clientipsocket_getpeername($newClient,$ip);$clients[$ip]=$newClient;echo"Clientip:{$ip}\\n";echo"Clientmsg:{$line}\\n";}else{socket_recv($_sock,$buffer,2048,0);$msg=$this->message($buffer);//在这里业务代码echo"{$key}clinetmsg:",$msg,"\\n";fwrite(STDOUT,'Pleaseinputaargument:');$response=trim(fgets(STDIN));$this->send($_sock,$response);echo"{$key}responsetoClient:".$response,"\\n";}}}}/***握手处理*@param$newClientsocket*@returnint接收到的信息*/publicfunctionhandshaking($newClient,$line){$headers=array();$lines=preg_split("/\\r\\n/",$line);foreach($linesas$line){$line=chop($line);if(preg_match('/\\A(\\S+):(.*)\\z/',$line,$matches)){$headers[$matches[1]]=$matches[2];}}$secKey=$headers['Sec-WebSocket-Key'];$secAccept=base64_encode(pack('H*',sha1($secKey.'258EAFA5-E914-47DA-95CA-C5AB0DC85B11')));$upgrade="HTTP/1.1101WebSocketProtocolHandshake\\r\\n"."Upgrade:websocket\\r\\n"."Connection:Upgrade\\r\\n"."WebSocket-Origin:$this->address\\r\\n"."WebSocket-Location:ws://$this->address:$this->port/websocket/websocket\\r\\n"."Sec-WebSocket-Accept:$secAccept\\r\\n\\r\\n";returnsocket_write($newClient,$upgrade,strlen($upgrade));}/***解析接收数据*@param$buffer*@returnnull|string*/publicfunctionmessage($buffer){$len=$masks=$data=$decoded=null;$len=ord($buffer[1])&127;if($len===126){$masks=substr($buffer,4,4);$data=substr($buffer,8);}elseif($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;}/***发送数据*@param$newClinet新接入的socket*@param$msg要发送的数据*@returnint|string*/publicfunctionsend($newClinet,$msg){$msg=$this->frame($msg);socket_write($newClinet,$msg,strlen($msg));}publicfunctionframe($s){$a=str_split($s,125);if(count($a)==1){return"\\\\x81".chr(strlen($a[0])).$a[0];}$ns="";foreach($aas$o){$ns.="\\\\x81".chr(strlen($o)).$o;}return$ns;}/***关闭socket*/publicfunctionclose(){returnsocket_close($this->_sockets);}}$sock=newSocketService();$sock->run();

作者: 大白菜装机

为您推荐

返回顶部