🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
swoole.websocket.Connect建议定义;每个客户端都会先建立握手,这里是必经之处。比如在这里记录你自己程序用户与客户端的连接ID(fd)等。 swoole.websocket.Test是自定义的test消息接收事件,该类事件定义的事件类 是用于接收客户端发送过来的消息并自行处理后续逻辑。该类事件可以定义任意个,比如一个项目可以有聊天、客服、直播等多种实时通讯场景,你可以分别定义不同的事件来分开处理不同场景的逻辑业务。 操作说明: Connect事件中的KaTeX parse error: Undefined control sequence: \\Request at position 10: event是app\\̲R̲e̲q̲u̲e̲s̲t̲请求对象 Test自定义消息接…event是客户端发送过来的消息 \\think\\Swoole\\Websocket类对象方法: broadcast 设置进行广播消息发送 isBroadcast 判断当前是否是广播模式 to 设置收件人fd或聊天室名(可以数组设置多个) getTo 获取收件人fd或聊天室名 join 当前客户端加入到指定聊天室(可以多个) leave 当前客户端离开指定聊天室(可以多个) emit 消息发送 close 关闭当前连接 getSender 获取当前客户端id(即fd) setSender 设置发件人的fd \\think\\swoole\\Manager类对象方法: getServer 获取当前Swoole的服务对象,利用该对象直接操作原生Swoole服务方法 stop 停止服务 app\\listener\\WsConnect 中的测试代码 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200505123057699.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2E2MDM0MjMxMzA=,size_16,color_FFFFFF,t_70) 客户端 ~~~ <html> <head></head> <body> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script> 接收者<input type="text" id="fid"> 发送内容<input type="text" id="content"> <button onclick="aaa()">发送</button> <script>ip var ws = new WebSocket("ws://ip:端口/"); ws.onopen = function () { console.log('lianjiezhong') }; ws.onclose = function () { console.log("lianjieguanbi") }; ws.onmessage = function (evt) { console.log(evt) }; function aaa(){ var fid = $("#fid").val(); var content = $("#content").val(); ws.send(JSON.stringify(['test',{ to:fid, aa:content }])); } </script> </body> </html> ~~~ 服务端接收并返回 ~~~ <?php declare (strict_types = 1); namespace app\listener; class WsTest { /** * 事件监听处理 * * @return mixed */ public function handle($event) { $ws = app('think\swoole\Websocket'); //发送指定客户端,包括发送者自己 //to 也可以是一个数据,发送给多个人 //testcall 自定义事件名称 $ws -> to(intval($event['to'])) ->emit('testcall',[ 'form' =>[ 'id' => 88, 'name' => "刘备" ], 'to' => [ 'id' => 99, 'name' => "张飞" ], 'message' => [ 'id' => 100, 'createtime' => "1000-3-5", 'message' => $event['aa'] ] ]); } } ~~~ ~~~ //广播,发送给所有人, 但不发送给自己 // 自定义事件名, 接收发送内容 $ws ->broadcast()->emit('gb',$event['aa']); //模拟发送 模拟2 给3 发送信息,其实是1发的 //setSender 模拟谁 $ws -> setSender(2) -> to(3) -> emit('mn',$event['aa']); //因为think-swoole 有一些方法并没有包含所有的swoole,那么怎么才能获得 //swoole本身的方法呢?如下 //1. 直接获取 $ser1 = app('swoole.server'); //2. 通过Manager 管理类获取 $ser2 = app('think\swoole\Manager')->getServer(); //验证类是否相同 var_dump(get_class($ser1)); var_dump(get_class($ser2)); //接下来就可以用swoole本身的一些方法了,并不局限于think-swoolele //可以用什么方法具体看swoole手册 验证结果 ~~~ ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200505125923850.png) ## 客户端回调 必须注意的地方是最后发送消息的send方法,由于think-swoole中是按照socketio进行解析发送过来的数据,所以你发送的数据应该是”\[‘事件名’, 真正要发送的数据\]”的字符串形式:第一个参数的test就是对应服务器端的Test事件,用于区分更多场景的实时通信逻辑业务;第二个参数才是你真正发送的数据可以是字符串、数据、对象,服务器端$event参数获取的就是它。 需要注意的是返回的字符串并不是直接的JSON字符串。前面多了一个42( socketio 的2个状态码),你需要自行通过JS匹配出第一个“\[”字符的位置(str.indexOf(‘\[’))然后截取(str.substr(start, end))出来才可以获取到JSON对象。你可以通过返回JSON的第一个值(事件名)判断出对应到什么场景的业务。 下面代码实例客户端处理数据 ~~~ <html> <head></head> <body> <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.js"></script> 接收者<input type="text" id="fid"> 发送内容<input type="text" id="content"> <button onclick="aaa()">发送</button> <script> var ws = new WebSocket("ws://ip:端口/"); ws.onopen = function () { console.log('lianjiezhong') }; ws.onclose = function () { console.log("lianjieguanbi") }; ws.onmessage = function (evt) { // console.log(evt.data) call_message(evt.data) }; //处理回调参数 function call_message(data){ //处理回调数据 console.log(data); var start; var start_arr = data.indexOf('['); var start_json = data.indexOf('{'); if(start_arr < 0){ start = start_json; } if(start_arr >= 0 && start_json >= 0){ start = Math.min(start_arr,start_json); } if(start){ var json = JSON.parse(data.substr(start)); if (json instanceof Array){ window[json[0]](json[1]) } } } function testcall(message){ console.log(message); } function aaa(){ var fid = $("#fid").val(); var content = $("#content").val(); ws.send(JSON.stringify(['test',{ to:fid, aa:content }])); } </script> </body> </html> ~~~