手机版

php实现websocket实时消息推送

时间:2021-08-31 来源:互联网 编辑:宝哥软件园 浏览:

Php实现websocket实时消息推送供大家参考,具体内容如下

SocketService.php

?php/** *由xwx *日期: 2017/10/18 *时间: 14:33 *创建/class套接字服务{ private $ address=' 0。0 .0 .0 ';私有$ port=8083私有$ _套接字;public function _ _ construct($ address=' ',$port='') { if(!empty($ address)){ $ this-address=$ address;} if(!空($ port)){ $ this-port=$ port;} }公共功能服务(){ //获取传输控制协议协议号码。

$ TCP=getproto by name(' TCP ');$sock=socket_create(AF_INET,SOCK_STREAM,$ TCP);socket_set_option($sock,SOL_SOCKET,SO _ REUSEADDR,1);if($ sock 0){ 0引发新异常('未能创建socket: ' .socket_strerror($sock ).\ n ');} socket_bind($sock,$this-address,$ this-port);socket_listen($sock,$ this-port);"回声"收听$这个地址$这个端口.\ n ';$ this-_ sockets=$ sock;}公共函数run(){ $ this-service();$ clients[]=$ this-_ sockets;while(true){ $ changes=$ clients;$ write=NULL $ except=NULLsocket _ select($ changes,$ write,$ except,NULL);foreach($更改为$ key=$ _ sock){ if($ this-_ sockets==$ _ sock){//判断是不是新接入的socket if(($ new client=socket _ accept($ _ sock))==false){ die('未能接受socket: ' .socket_strerror($_sock).\ n ');} $ line=trim(socket _ read($ new client,1024));$这个-握手($newClient,$ line);//获取客户端IP socket _ getpeername($新客户端,$ IP);$ clients[$ IP]=$ new client;回显“客户端IP : { $ IP } \ n”;回显“客户端消息: { $ line } \ n”;} else { socket_recv($_sock,$buffer,2048,0);$ msg=$ this-message($ buffer);//在这里业务代码echo"{ $ key } clinet msg : ',$msg,' \ n ';fwrite(STDOUT ')请输入一个参数: ');$ response=trim(fgets(STDIN));$this-send($_sock,$ response);回应对客户端:的$key '响应$response,' \ n ';} } } } /** * 握手处理* @param $newClient套接字* @返回int接收到的信息*/public函数握手($newClient,$ line){ $ headers=array();$ line=preg _ split('/\ r \ n/',$ line);foreach($ line as $ 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).258 eafa 5-E914-47DA-95CA-c5ab 0dc 85b 11’;$upgrade='HTTP/1.1 101 Web套接字协议握手\r\n ' .Upgrade: websocket\r\n ' .连接:升级\r\n ' .WebSocket-origin : $ this-address \ r \ n ' .web套接字-位置: ws :/sec-WebSocket-accept : $ sec accept \ r \ n \ r \ n ';return socket_write($newClient,$upgrade,strlen($ upgrade));} /** * 解析接收数据* @ param $ buffer * @返回null | string */public function message($ buffer){ $ len=$ masks=$ data=$ decode=null;$ len=order($ 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){ $已解码=$ data[$ index]^ $ masks[$索引% 4];}返回$ decode }/* * *发送数据* @param $newClinet新接入的套接字* @param $msg要发送的数据* @ return int | string */public function send($ newClinet,$ msg){ $ msg=$ this-frame($ msg);socket_write($newClinet,$msg,strlen($ msg));}公共函数框架($s) { $a=str_split($s,125);if(count($ a)=1){ return ' \ x81 ' .chr(strlen($a[0]).$ a[0];} $ ns=foreach ($a as $o) { $ns .='\x81 ' .人权委员会(strlen(o)).$ o;}返回$ ns} /** *关闭socket */public function close(){ return socket _ close($ this-_ sockets);} } $ sock=new Socketservice();$袜子运行();web.html

!doctype html html lang=' en ' head meta charset=' UTF-8 ' meta name=' viewport ' content=' width=device-width,initial-scale=1,maximum-scale=1,user-scaled=no ' title web socket/title/head body输入id=' text '值=' input type=' submit '值=' send ' onclick=' start()' input type=' submit '值=' close ' onclick=' close()' div id=' msg '/div script/* * 0:未连接1:连接成功,可通讯2:正在关闭3:连接已关闭或无法打开*///创建一个求转发到实例var webSocket=new webSocket(' ws ://192。168 .31 .152:8083 ');WebSocket。onError=函数(事件){ onError(事件);};//打开web套接字web套接字。onOpen=函数(事件){ onOpen(事件);};//监听消息WebSocket。onMessage=function(event){ onMessage(event);};webSocket.onclose=function(事件){ onClose(事件);} //关闭监听求转发到函数onError(事件){ document。getelementbyid(' msg ').innerHTML=' PC lost/p ';控制台。日志('错误'事件。数据);};函数onOpen(事件){控制台。日志(' open : ' sockState());document.getElementById('msg ').innerHTML=连接到服务/p ';};函数onMessage(事件){控制台。日志(' Onmessage ');document.getElementById('msg ').innerHTML=' pre response : '事件。数据'/p ' };函数onClose(事件){ document.getElementById('msg ').innerHTML=' PC lost/p ';控制台。日志(' close : ' SockState());WebSocket。close();}函数sockState(){ var status=['未连接','连接成功,可通讯','正在关闭','连接已关闭或无法打开'];返回状态[WebSocket。ReadyState];}函数开始(事件){控制台。日志(WebSocket);var msg=文档。getelementbyid(' text ').价值;document.getElementById('text ').值=' ';控制台。日志(' send : ' sockState());控制台。日志(' msg=' msg ');WebSocket。发送(' msg=' msg ');document.getElementById('msg ').innerHTMl=' prequest ' msg '/p ' };函数关闭(事件){ WebSocket。close();}/脚本/正文/html以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:php实现websocket实时消息推送是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。