微信小程序使用swoole实现websocket消息推送

swoole我个人建议在linux环境下操作,毕竟在windows下有那么一点点麻烦。首先linux安装php和swoole环境(有手就行,建议百度)。
因为我们的业务是实现消息推送,也就是在完成特定操作时向swoole发送一个请求,然后swoole能够推送回来这条请求到指定的位置。
直接上代码


//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9501);

//监听WebSocket连接打开事件
/**
 * 客户端想服务器发送信息是调用函数
 * $ws   websocket 服务器
 * $request 客户端信息
 * $request->fd 客户端唯一编号
 *
 * */
$ws->on('open', function ($ws, $request) {
    //var_dump($request->fd, $request->get, $request->server);
    //$ws->push($request->fd, "hello, welcome\n");
    echo "connection open:{$request->fd}\n";
    //$ws->push($request->fd, json_encode(['hello','world']));
});

//监听WebSocket消息事件
/**
 * $frame 客户端发送的信息
 * $frame->fd 客户端的唯一编号
 * $frame->data 客户端发送的信息
 * */
$ws->on('message', function ($ws, $frame) {
    //echo "接收到的信息: {$frame->data}\n";
    //$ws->push($frame->fd, "server: {$frame->data}");
    //echo "服务器已接收:【".$frame->fd."】";
    //$ws->push($frame->fd, json_encode(['hello','world'.$frame->data]));


    // 1.客户端发送过来的信息
    $content = $frame->data;
    echo "服务器接收到信息:".$content;
    // 2.讲消息发送个所有客户端
    foreach ($ws->connections as $fd){
        $ws->push($fd,$content);
    }
});

//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
    echo "已断开链接:{$fd}";
});

$ws->start();

然后微信小程序端有个连接websocket的方法,可以写在页面onload中:

wx.connectSocket({
      url: 'ws://你的IP地址:9501/',
      success:res=>{
        console.log(res);
      }
      
    })
wx.onSocketOpen(function (res) {
      socketOpen = true;
      console.log(111)
    })
    //监听 WebSocket 接受到服务器的消息事件
    wx.onSocketMessage(function (res) {
      var result = JSON.parse(res.data)
      var msg=result.msg;
      that.data.message.push(msg)
     //数组转字符串
      var num=that.data.num+1;
      if (result) {
        that.setData({
          num,
        })
        wx.setStorageSync('num', num)
        wx.setStorageSync('message', that.data.message)
        console.log(that.data.message);
        console.log(that.data.num);
      }
    })

以上就是小程序中连接、接收以及处理swoole消息的代码,具体根据自己业务进行更改。
之后我们要给服务端一个触发事件,只要触发事件,就会向服务器发送请求及数据,然后服务器返回到他应去的地方。

//触发事件
send() {
      //服务端通讯 
      if (socketOpen) { //是否正常
        var nickname = wx.getStorageSync('nickName')
        if (nickname == "") {
          nickname = "游客"
        }
        var data = '{"name":"' + nickname + '","msg":"' + inputMessage + '"}'
        //发送数据
        wx.sendSocketMessage({
          data: data
        })
      }
    },

到此核心代码完毕。
我们先来梳理一下流程:
服务端swoole开启–>小程序端onload中连接websocket–>触发事件向服务端推送消息–>onload中监听事件监听到消息存本地展示
OK,没问题

你可能感兴趣的:(swoole,php,websocket,swoole,微信小程序)