PHP+Swoole 搭建 Websocket 聊天室

1.这里用的线上服务器宝塔

先建立一 .php文件

 2.到swoole官网Swoole4 文档

3.前端测试连接

先打开进入文件所在的目录

 

 wx.connectSocket({
      url: 'ws://域名:9502',  在微信公众平台进行绑定
    })

 小程序

 4.前端渲染

<view wx:for="{{list}}" wx:key="index">
  <view class="{{item.class}}">{{item.message}}</view>
  <!-- <view>you</view> -->
</view>
<view>
  <view><input type="text" bindinput="getMsg" placeholder="请输入内容"/></view>
  <button bindtap="sendMsg">发送</button>
</view>

5.js页面

// pages/swo/swo.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    list:[]
  },
  getMsg(c){
    this.setData({
      message:c.detail.value
    })
  },
  snedMsg(c){
    let send = {
      to:'a',
      my:'b',
      type:'send',
      data:this.data.message
    }
    this.send(JSON.stringify(send));
    this.webSockertXin(6000,false)
    let list = this.data.list
    list.push({
      class:'my',
      message:this.data.message
    })
    this.setData({
      list:list
    })
  },
  send(data){
    wx.sendSocketMessage({
      data: data,
    })
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    wx.connectSocket({
      url: 'ws://swoole.ckl.ink:9502',
    })
    this.webSockertXin()
    wx.onSocketOpen((result) => {
      let send = {
        to:'a',
        my:'b',
        type:'open'
      }
      this.send(JSON.stringify(send))
    })
    wx.onSocketMessage((result) => {
      console.log(result)
      let message = JSON.parse(result.data)
      console.log(message.message)
      let list = this.data.list
      list.push({
        class:'you',
        message:message.message
      })
      this.setData({
        list:list
      })
    })
  },
  webSockertXin(time = 6000,state = true){
    let timer
    if(state == true){
      let timer = setInterval(function(){
        console.log('当前心跳已连接');
        wx.sendSocketMessage({
          data: JSON.stringify({
            type:'active'
          }),
          fail(res){
            wx.closeSocket()
            wx.showToast({
              title: '当前聊天已断开',
              icon:'none'
            })
            clearInterval(timer)
            console.log('当先心跳已关闭')
          }
        })
      },time);
    }else{
      clearInterval(timer);
      console.log('当前心跳已关闭')
    }
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
    wx.closeSocket();
  },


})

6.wxss页面

.my{
  text-align: right;
}

 7.配置文件

<?php
    //创建WebSocket Server对象,监听0.0.0.0:9502端口
    $ws = new Swoole\WebSocket\Server('0.0.0.0', 9502);
    
    $redis = new Redis();
    $redis->connect('127.0.0.1','6379');
    //监听WebSocket连接打开事件
    $ws->on('Open', function ($ws, $request) {
        // $ws->push($request->fd, "连接上了!!!\n");
    });
    
    //监听WebSocket消息事件 
    $ws->on('Message', function ($ws, $frame) use($redis) {
        $data = json_decode($frame->data,true);
        switch ($data['type']) {
            case 'open':
                $redis->set($data['my'],$frame->fd);
                break;
            case 'send':
                $to = $redis->get($data['to']);
                // print_r($to);
                $message = [
                    'message' => $data['data']
                ];
                // print_r($message);
                $ws->push($to,json_encode($message,true));
                break;
            case 'active':
                echo '当前心跳已重新连接';
                break;
            default:
                // code...
                break;
        }
        // echo "Message: {$frame->data}\n";
        // $ws->push($frame->fd, "server: {$frame->data}");
    });
    
    //监听WebSocket连接关闭事件
    $ws->on('Close', function ($ws, $fd) {
        echo "client-{$fd} is closed\n";
    });
    
    $ws->start();


7.另一端跟上面的一样复制一份将接收信息者调换就行了

 8.下面是心跳检测

 /**
   * 监听websocket心跳连接的方法
   */
  webSocketXin(time = 60000, status = true) {
    var timing;
    if (status == true) {
      timing = setInterval(function () {
        console.log("当前心跳已重新连接");
        //循环执行代码
        wx.sendSocketMessage({
          data: JSON.stringify({
            type: 'active'
          }),
          fail(res) {
            //关闭连接
            wx.closeSocket();
            //提示
            wx.showToast({
              title: '当前聊天已断开',
              icon: 'none'
            });
            clearInterval(timing);
            console.log("当前心跳已关闭");
          }
        });
      }, time) //循环时间,注意不要超过1分钟
    } else {
      //关闭定时器
      clearInterval(timing);
      console.log("当前心跳已关闭");
    }
  }

二例

<?php

//创建WebSocket Server对象,监听0.0.0.0:9502端口
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9521);

//监听WebSocket连接打开事件
$ws->on('Open', function ($ws, $request) use ($chatMessagesKey, $roomUserKey, $roomOnlinesKey) {
    echo $request->fd . '我连接上了';
});

//监听WebSocket消息事件
$ws->on('Message', function ($ws, $frame) {
    print_r($frame);
    //把前台传过来的json字符串转成数组
    $params = json_decode($frame->data, true);
    //判断是否是心跳消息,如果是心跳消息
    if (isset($params['type']) && isset($params['type'])=='active'){
        echo '这是心跳监听消息';
    }else{
         //先判断当前用户有没有正在连接
        if (isset($params['uid']) && !empty($params['uid'] == 666)) {
            //用户表查询当前用户  fd
            $fd = 2;
        } else {
            $fd = 1;
        }
        //客服id
        $ws->push($fd, json_encode($params, JSON_UNESCAPED_UNICODE));
    }
});

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

$ws->start();

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值