<?php//官网demo$server = new swoole_websocket_server("0.0.0.0", 9501);$server->on('open', function (swoole_websocket_server $server, $request) { echo "server: handshake success with fd{$request->fd}\n";//$request->fd 是客户端id});$server->on('message', function (swoole_websocket_server $server, $frame) { echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n"; $server->push($frame->fd, "this is server");//$frame->fd 是客户端id,$frame->data是客户端发送的数据 //做事端向客户端发送数据是用 $server->push( '客户端id' , '内容')});$server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n";});$server->start();
我便是喜好这种大略易懂的demo ,每行代码意思一看就明白
做事端有了,我找点客户真个js代码火狐的MDN
<!DOCTYPE html><html><head> <title></title> <meta charset="UTF-8"> <script type="text/javascript"> var exampleSocket = new WebSocket("ws://0.0.0.0:9501"); exampleSocket.onopen = function (event) { exampleSocket.send("亲爱的做事器!
我连上你啦!
"); }; exampleSocket.onmessage = function (event) { console.log(event.data); } </script></head><body><input type="text" id="content"><button onclick="exampleSocket.send( document.getElementById('content').value )">发送</button></body></html>
末了命令走运行php文件,之后浏览器打开html文件,F12打开调试界面看console,ok , 没有问题
这个时候我溘然想到一个事情,由于我做多进程的那个教程里,在主进程中会将所有的子进程的句柄存起来,往后进行进程间通讯用。那么 我将所有的客户真个链接存起来存成数组,每当一个客户端发送时,我就遍历这个客户端数组,将群发一遍,不久实现了谈天室了吗?然后就,做事端代码成了这个样子
<?php$map = array();//客户端凑集$server = new swoole_websocket_server("0.0.0.0", 9501);$server->on('open', function (swoole_websocket_server $server, $request) { global $map;//客户端凑集 $map[$request->fd] = $request->fd;//首次连上时存起来});$server->on('message', function (swoole_websocket_server $server, $frame) { global $map;//客户端凑集 $data = $frame->data; foreach($map as $fd){ $server->push($fd , $data);//循环广播 }});$server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n";});$server->start();
哈哈 , 我以为这样就大功告成了,结果创造自己是 图样图森破大家可以自己试试,运行php后 , 浏览器打开两个页面,看看console.log的内容是什么
运行良好,可是并没有实现我们说的那种谈天效果。找找缘故原由吧。我第一反响看看$map里面是什么,就输出看看,结果创造这个map里面只有一个元素。唉,不对啊,我这是全局变量,难道不应该是有几个客户端链接,就有几个元素吗?这是怎么回事啊,竟然没有保存到所有客户端id?
到了这一步,我办理不了map变量的这个问题了,然后我就想看看那个fd是什么东西,老规矩 var_dump输出 , 创造fd便是 int类型的数字,并且是自增的这好办了,不便是数字嘛
于是呼,我就这样做变量存不了,我搞不定,我存文本里嘛。终极版 websocket.php
<?php$server = new swoole_websocket_server("0.0.0.0", 9501);$server->on('open', function (swoole_websocket_server $server, $request) { file_put_contents( __DIR__ .'/log.txt' , $request->fd);});$server->on('message', function (swoole_websocket_server $server, $frame) { global $client; $data = $frame->data; $m = file_get_contents( __DIR__ .'/log.txt'); for ($i=1 ; $i<= $m ; $i++) { echo PHP_EOL . ' i is ' . $i . ' data is '.$data . ' m = ' . $m; $server->push($i, $data ); }});$server->on('close', function ($ser, $fd) { echo "client {$fd} closed\n";});$server->start();
再次打开html文件,多个页面进行输入不雅观察,ok,可以了。
当然,作为谈天室,我这写的也过于简陋了,界面大家自己可以写的好看一些(由于我
然后,大家可以愉快的谈天了。哈哈
在“疫情”期间已经淘汰了一批末端的业务coder,现在是自己努力成为资深程序员的好机遇,才能在面对高薪职位约请时,做到胸有成竹。为了大家能够顺利进阶PHP中高等程序员、架构师,我为大家准备了一份中高等的教程福利!
作为web开拓的佼佼者PHP并不逊色其他措辞,加上swoole后更加是为虎傅翼!
进军通信 、物联网行业开拓百度舆图、百度订单中央等!
年后更是霸占程序员招聘措辞第二名,疫情裁员期过后正是各大企业扩大招人的期间,现在市场低级程序员泛滥,进阶中高等程序员绝对是各大企业急需的人才,这套教程适宜那些1-6年的PHP开拓者进阶中高等提升自己,在春招中找到高薪职位!
领取办法:点赞关注小编后私信【资料】获取资料领取办法!