thinkphp6 think-swoole websocket发送完成和常用方法和客户端回调

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 中的测试代码

在这里插入图片描述

客户端

<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手册

	验证结果

在这里插入图片描述

客户端回调

必须注意的地方是最后发送消息的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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值