小程序swool 实现心跳,一对一私密链接

swool在linux系统使用,不支持win系统,需要线上服务器。

线上代码:

<?php

//创建WebSocket Server对象,监听0.0.0.0:9502端口
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9501);
 
//实例化Redis
$redis = new Redis();
//对redis进行连接
$redis->connect('127.0.0.1','6379');
 
//监听WebSocket连接打开事件
$ws->on('Open', function ($ws, $request) {
    //向小程序端进行一个连接返回,告知用户已经连接上服务器,返回值需要转为json数据格式
    $ws->push($request->fd, json_encode(['msg'=>'用户已连接'],true));
});
 $server->set([
        'heartbeat_idle_time'      => 600, 
         'heartbeat_check_interval' => 60, 
        //  daemonize => true
    ]);
//监听WebSocket消息事件
$ws->on('Message', function ($ws, $frame) use ($redis) {
    //将我们从小程序端传递过来的数据转换成数组格式进行处理
    $data = json_decode($frame->data,true);
  
   
    //通过小程序端传递过来的类型进行处理
    switch($data['type']){
        //如果类型为连接
        case "open" :
            //将登录的用户昵称设为键,保存用户id
            $redis->set($data['my'],$frame->fd);
            break;
        //如果类型为发送
        case "send" :
            //取出我们发送给对方的id
            //【当前登陆用户为yuchen,我们要发送给miao,存进去的用户信息为yuchen信息,取出来的是miao信息】
            //【当前登陆用户为miao,我们要发送给yuchen,存进去的用户信息为miao信息,取出来的是yuchen信息】
            $toId = $redis->get($data['he']);
            //将用户昵称和所要发送的消息返回给小程序端
         $msg = [
                'user' => $toId,
                'msg' => $data['data']
            ];   
            // print_r($msg);
            //我们要将消息push给对方,也就是当前登录yuchen,push给miao
            $ws->push($msg['user'], json_encode($msg));
            break;
        default:
            
            break;
    }
    
});
 
//监听WebSocket连接关闭事件
$ws->on('Close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
});
 
$ws->start();

小程序端   js 

// pages/server/server.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    msg: '',
    list: [],
  },
  setMsg(e) {
    // console.log(e.detail.value);
    let msg = e.detail.value
    this.setData({
      msg: msg
    })
  },
  getMsg(e) {
    let id = 'yuchen'
    let msg = this.data.msg
    let list = this.data.list
    list.push({
      name: 2,
      msg: msg
    })
    this.setData({
      list, id: 2
    })
    let send = {
      he: id,
      my: 2,
      type: 'send',
      data: msg
    }
    this.send(JSON.stringify(send))
  },
  send(data) {
    wx.sendSocketMessage({
      data: data
    });
  },
  cache()
  {
    let list = this.data.list
    wx.request({
      url: 'http://www.yiliao.com/api/cache',
      data: {},
      header: { 'content-type': 'application/json' },
      method: 'GET',
      dataType: 'json',
      responseType: 'text',
      success: (result) => {
        list=result.data.data
          this.setData({
            list
          })
      },
      fail: () => { },
      complete: () => { }
    });
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    
    let id = 'yuchen'
    wx.connectSocket({
      url: 'ws://ly.linyin.xyz:9501',
    });
    wx.onSocketOpen(result => {
      let open = {
        he: id,
        my: 2,
        type: 'open',
      }
      this.send(JSON.stringify(open))
    });
    // this.sendTime()
    this.message()
  },
  message() {
    wx.onSocketMessage((result) => {
      let data = JSON.parse(result.data)
      let list = this.data.list
      list.push({
        name: data.user,
        msg: data.msg
      })
      this.setData({
        list, id: 2
      })
    })
  },

  sendTime(time = 3000, status = true) {
    if (status == true) {
      let timer = setInterval(function () {
        console.log('心跳已连接');
        wx.sendSocketMessage({
          data: JSON.stringify({
            type: 'type'
          }),
          fail: () => {
            console.log('心跳连接失败');
            wx.closeSocket();
            wx.showToast({
              title: '关闭心跳连接',
              icon: 'none',
              duration: 1500,
            });
            clearInterval(timer)
          }
        });
      }, time)
    }
  },
})

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值