WebSocket + 微信小程序 一对一聊天

        本文章使用webSocket + 微信小程序实现一个双方都在线的一对一聊天,服务端使用为宝塔。

        在宝塔中,我们需要将我们会用到的端口号开启,会用到Redis,swoole,分别放行之后,我们就要创建文件夹并新建一个php文件  名字自起。

        双击文件我们对其进行编辑

<?php

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

//实例化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));
});

//监听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['to']);
            //将用户昵称和所要发送的消息返回给小程序端
            $msg = [
                'user' => $data['my'],
                'msg' => $data['data']
            ];
            //我们要将消息push给对方,也就是当前登录yuchen,push给miao
            $ws->push($toId, json_encode($msg,true));
            break;
        default:
            
            break;
    }
    
});

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

$ws->start();

        对进程添加守护和心跳检测

$ws->set(array(
    'daemonize' => true,    //守护进程
    'heartbeat_idle_time'      => 600, // 表示一个连接如果600秒内未向服务器发送任何数据,此连接将被强制关闭
    'heartbeat_check_interval' => 60,  // 表示每60秒遍历一次
));

        接着下我们需要在小程序中进行编写

        首先我们的封装一个连接,将小程序和服务器连接起来

open:function(){
    let _this = this;
    //建立连接
    wx.connectSocket({
        //对应ip及端口
        url: 'wss://example.qq.com',
        success:function(){
            //监听连接事件
            wx.onSocketOpen((result)=>{
                let msg = {
                    'to' : 'miao',    //对方是谁
                    'my' : 'yuchen',    //我是谁
                    'type' : 'open'    //当前状态
                }
                //向服务器发送信息,需要转换为json
                _this.send(JSON.stringify(msg));
                //接收服务器返回信息
                _this.serverMsg(); 
            })
        }
    })
}

        封装发送信息,接收服务器返回信息,获取输入信息并发送方法

//发送信息
send:function(res){
    //调用向服务器发送信息函数
    wx.sendSocketMessage({
        data : res
    })
}

//获取输入框信息并发送
sendMyMsg:function(option){
    let myMsg = option.detail.value.text;
    let msg = {
        'to' : 'miao',    //发送给谁
        'my' : 'yuchen',    //我是谁
        'type' : 'send',    //当前状态
        'data' : myMsg    //发送信息
    }
    this.send(JSON.stringify(msg));    //调用发送方法,向服务器发送数据
    let data = this.data.records;    //将页面data内的数组records进行调用
    //将用户名称及发送信息追加到数组中
    data.push({
        user : msg.my,
        msg : myMsg
    })
    //进行数据传递
    this.setData({
        records : data
    })
}

//接收服务器返回消息
serverMsg:function(){
    let _this = this;
    //调用接收函数,接收服务器返回数据
    wx.onSocketMessage((result)=>{
        //因为在数据库中返回的数据为json数据格式,因此我们需要在前台进行转义
        let parseMsg = JSON.parse(result.data);
        let data = _this.data.records;    //调用页面data内的数组records
        //接收到的数据追加到数组中
        data.push({
            user : parseMsg.user,
            msg : parseMsg.msg
        })
        //数据传递
        _this.setData({
            records : data
        })
    })
}

        到此,只需要在wxml页面进行循环展示即可。

<view>
  <view>
    <block wx:for="{{data}}">
      <view>
        <text>{{item.user}}:</text>
        <text>{{item.msg}}</text>
      </view>
    </block>
  </view>
  <view>
    <form action="" bindsubmit="sendMyMsg">
      <input class="input" value="{{value}}" type="text" name="text"/>
      <button size="mini" type="primary" form-type="submit">发送</button>
    </form>
  </view>
</view>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
微信小程序是一种基于微信平台开发的轻量级应用程序,允许开发者构建功能丰富、交互性强的应用。其中,使用WebSocket实现实时聊天功能是常见的需求之一。 WebSocket是一种双向通信协议,允许服务器与客户端之间进行实时、持久的通信。在微信小程序中,通过使用WebSocket技术,我们可以实现实时的聊天功能。 首先,我们需要在小程序中引入WebSocket相关的API接口,如wx.connectSocket()用于建立与服务器的WebSocket连接,wx.onSocketOpen()用于监听WebSocket连接建立成功的事件,wx.sendSocketMessage()用于向服务器发送消息,wx.onSocketMessage()用于监听服务器返回的消息。 接下来,在小程序的页面中,我们可以通过调用wx.connectSocket()来连接WebSocket服务器,需要传入服务器的URL地址。在连接成功后,通过wx.onSocketMessage()监听服务器返回的消息,在回调函数中将消息更新到页面上。而发送消息则通过调用wx.sendSocketMessage()来实现。 此外,为了提高用户体验,我们还可以在页面上添加输入框和发送按钮,以便用户输入消息并发送。通过监听输入框的变化事件,可以获取用户输入的内容。然后,当用户点击发送按钮时,将获取到的消息使用wx.sendSocketMessage()发送给服务器。 需要注意的是,在小程序中使用WebSocket进行聊天时,需要确保服务器端也实现了相应的WebSocket功能,以便实现双向通信。同时,为了保障数据的安全性,可以考虑对聊天内容进行加密和身份验证等操作。 总的来说,微信小程序支持使用WebSocket实现实时聊天功能。开发者只需引入相关的API接口,并在页面上监听和处理相关事件,就可以实现用户和服务器之间的实时交流。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值