方法基于PHP+HTML5WebSocket聊天室的实现

方法基于PHP+HTML5WebSocket聊天室的实现
在本文中,PHP + HTML5的方法描述了基于WebSocket聊天室。分享给你供你参考。以下是如下:

HTML5的WebSocket实现双向通信,折腾了几天聊天室,共享给大家
< PHP
error_reporting(e_all);
ob_implicit_flush();
为SK为新袜子('127.0.0.1 ',8000);
运行);
类袜子{
公用插座;
公共用户
公共硕士;
公共功能__construct($美元地址,端口){
美元->主=美元-> WebSocket($美元地址,端口);
这个数组=(数组);
}
函数运行(){
当(真){
$ =;
socket_select(美元的变化,美元写= null,$除= null,null);
foreach(美元的变化,美元的袜子){
如果($ = $ = $此主){
为客户= socket_accept(美元->大师);
/ /美元关键= uniqid();
$ >套接字;
$ >用户} =数组(
客户端,

);
其他{ }
len = socket_recv美元(美元美元的袜子,缓冲,2048,0);
$ $ = $ >搜索(美元);
如果($<7){
$name =美元->用户{ $ K } {‘明'};
这$近($袜子);
美元-> 2($name,$K);
继续;
}
如果(!美元->用户{ } { } $ K 'shou){
美元-> woshou($ K,为缓冲);
其他{ }
为缓冲=美元->未编码($缓冲);
这$发送($ K,缓冲区);
}
}
}
}
}
函数关闭($ $){
K = array_search美元(美元的袜子,美元->插座);
socket_close(美元的袜子);
unset(美元->插座{ $ K });
unset(美元->用户{ $ K });
$;
}
函数搜索($ $){
foreach(美元->用户达k = > $ V){
如果($袜子= = $ V { 'socket})
返回k;
}
返回false;
}
功能WebSocket($地址,端口美元){
$ SERVER = socket_create(af_inet,sock_stream,sol_tcp);
socket_set_option($ SERVER,sol_socket,so_reuseaddr,1);
socket_bind(美元美元美元服务器地址,端口);
socket_listen($ SERVER);
美元-> E('server开始:'日期('y-m-d H:我:'));
美元-> E('listening:' $地址。'port'。$港);
返回$服务器;
}
功能woshou($ K,为缓冲){
但美元= substr($缓冲,strpos($缓冲,'sec-websocket-key:')+ 18);
美元关键=装饰(substr($ 0美元中,strpos(buf, R)))))
new_key美元= base64_encode(SHA1($关键。258eafa5-e914-47da-95ca-c5ab0dc85b11
new_message美元=HTTP / 1.1交换协议 R101 ;
new_message美元=升级:WebSocket R;
new_message美元=SEC WebSocket版本:13 R;
new_message美元=连接:升级 R;
new_message美元=秒可接受:new_key美元。;
socket_write(美元->用户{ } { } $ K 'socket,new_message美元,strlen($ new_message));
美元->用户{ } { } $ K 'shou=真;
返回true;
}
功能未编码($str){
掩码=数组();
$ =;
味精=解压(H *美元,$str);
$头= substr($味精{ 1 },0,2);
如果(hexdec(合头{ 1 })= 8){
$ = false;
} else if(hexdec(合头{ 1 })= 1){
面膜{ } = hexdec美元(substr($味精{ 1 },4,2));
面膜{ } = hexdec美元(substr($味精{ 1 },6,2));
面膜{ } = hexdec美元(substr($味精{ 1 },2));
面膜{ } = hexdec美元(substr($味精{ 1 },2));
$=12;
e = strlen($味精{ 1 })- 2;
$ = 0;
对于($ i = $;$ i = $;$ $ = 2){
$data = CHR($面膜{ $ N % 4 } ^ hexdec(substr($味精{ 1 },我,2)));
美元+;
}
}
返回$数据;
}
函数代码(MSG){
味精= preg_replace美元(阵列( / R $ / / ,$、$ ,),,;
帧();
$架{ 0 } = '81;
$ len = strlen($味精);
$架{ 1 } = $长度<16 '0'。dechex($ len):dechex($ len);
$架{ 2 } =美元-> ord_hex($味精);
$data =崩溃(',$框架);
返回包()h *
}
功能ord_hex($数据){
$ =;
$ L = strlen($数据);
($ i = 0;$ i $ l;$ + +){
$味精= dechex(ORD($数据{我}));
}
返回味精;
}
函数发送($ K,MSG){
/ *美元-> send1($ K,美元->代码,'($味精));* /
parse_str($味精,$ G);
此$ $ e(味精);
$ =数组();
如果($ G {类型} = = 'add){
美元->用户{ $ K } { } = { $ G‘明'的‘明'};
美元'add } =真正的AR {;
{ } =美元'nrong AR欢迎你。$ G {‘明'},加入!;
{ } = AR 'users美元的美元-> GetUsers();
美元关键= 'all';
} else if($ G { } = ='ltiao){
{ } = AR 'nrong美元的$ G { 'nr};
美元关键= $ G {关键};
}
味精= json_encode美元($ AR);
此$ $ e(味精);
$ = $这个代码;
美元-> send1($ K $美元,味精,关键);
/ / socket_write(美元->用户{ } { } $ K 'socket美元,味精,strlen($味精));
}
功能GetUsers(){
$ =数组();
foreach(美元->用户达k = > $ V){
{ } = K Ar美元美元美元V {‘明'};
}
返回$;
}
功能send1($ K,$str,美元关键= 'all'){
如果($key = =){
foreach(美元->用户达v){
socket_write($ V { } 'socket,$str,strlen(str));
}
其他{ }
如果(k)!= $键)
socket_write(美元->用户{ } { } $ K 'socket,$str,strlen(str));
socket_write(美元->用户{ } { }美元关键'socket,$str,strlen(str));
}
}
功能2(合明,$K){
美元'remove } =真正的AR {;
{ } = AR 'removekey美元的$ k;
{ } = AR 'nrong美元的美元'exit聊天室的明;
$str =美元->代码(json_encode($ ar));
美元-> send1(假,$str,'all');
}
函数E($ STR){
$路径= dirname(__file__)。 /日志.txt;
$str = $ 结构;
error_log($str,3,$路径);
回声iconv('utf-8 ','gbk / /忽略,$str);
}
}
>

希望本文能对大家的PHP程序设计有所帮助。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部