前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >uni-app+php+workman实现简单聊天功能之API开发

uni-app+php+workman实现简单聊天功能之API开发

作者头像
切图仔
发布2022-09-08 16:30:09
1.8K3
发布2022-09-08 16:30:09
举报
文章被收录于专栏:生如夏花绚烂

在之前的文章【laravel中Websocket基本使用】中我们已经初步搭建了websocket服务,现在我们只需要稍微修改一下Events即可 当连接成功时我们将客户端id发送的客户端

代码语言:javascript
复制
<?php

namespace App\Workerman;
use \GatewayWorker\Lib\Gateway;
class Events
{

    // businessWorker进程启动事件
    public static function onWorkerStart($businessWorker)
    {
    }
    //连接事件
    public static function onConnect($client_id)
    {
        // 向当前client_id发送数据
       return Gateway::sendToCurrentClient(json_encode(['type'=>'bind','data'=>$client_id]));
    }
    //进程退出事件
    public static function onWebSocketConnect($client_id, $data)
    {
    }
    //消息事件
    public static function onMessage($client_id, $message)
    {
         // 向所有人发送
        

    }
    // 连接断开事件
    public static function onClose($client_id)
    {
    }
}

用户绑定上线

代码语言:javascript
复制
<?php

namespace App\Http\Controllers\Api\V1;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
use Tymon\JWTAuth\Facades\JWTAuth;
use Illuminate\Http\Request;
use App\Http\Requests\Api\V1\ChatRequest;
use App\Http\Requests\Api\V1\ChatBindRequest;
use \GatewayWorker\Lib\Gateway;
use Cache;
class ChatController extends Controller
{

    public function bind(ChatBindRequest $request){
            //客户端发送的数据
            //{type:"bind",client_id:"7f0000010b5700000001"}';
            $userId = $request->user()->id;
            $client_id = $request->client_id;
            // 验证client_id合法性
            if (!Gateway::isOnline($client_id)) return $this->errorResponse('200','client_id错误',10004);
            // 验证当前客户端是否已经绑定
            if (Gateway::getUidByClientId($client_id)) return $this->errorResponse('200','已经绑定',10005);
            // 直接绑定
            Gateway::bindUid($request->client_id,$userId);
            // 返回成功
            return $this->showResCode('绑定成功',['type'=>'bind','status'=>true],200);
    }
    ...

发送消息

代码语言:javascript
复制
public function send(ChatRequest $request){
    // 1. 验证数据是否合法
    // 2. 组织数据
    $data = $this->resdata($request);
    $to_id = $request->to_id;
    // 3. 验证对方用户是否在线
    if (Gateway::isUidOnline($to_id)) {
        // 直接发送
        Gateway::sendToUid($to_id,json_encode($data));
        // 写入数据库
        // 返回发送成功
        return $this->showResCodeWithOutData('ok');
    }
    // 不在线,写入消息队列
    // 获取之前消息
    $Cache = Cache::get('userchat_'.$to_id);
    if (!$Cache || !is_array($Cache)) $Cache = [];
    $Cache[] = $data;
    // 写入数据库
    // 写入消息队列(含id)
    Cache::set('userchat_'.$to_id,$Cache);
    return $this->showResCodeWithOutData('ok');
}
 // 组织数据
public function resdata($request){
    return [
            'to_id'=>$request->to_id,
            'from_id'=>$request->user()->id,
            'from_userpic'=>$request->from_userpic,
            'type'=>$request->type,
            'data'=>$request->data,
            'time'=>time()
    ];
}

接受为接受消息

代码语言:javascript
复制
public function get(Request $request){
        // 判断当前用户是否在线
        if (!Gateway::isUidOnline($request->user()->id)) return;
        // 获取并清除所有未接收信息
        $Cache = Cache::pull('userchat_'.$request->id);
        if (!$Cache || !is_array($Cache)) return;
        // 开始推送
        return $this->showResCode('ok',$Cache);
}

路由

代码语言:javascript
复制
//socket
// 发送消息
Route::post('chat/send','ChatController@send');
 // 接收未接受信息
Route::post('chat/get','ChatController@get');
 // 绑定上线
Route::post('chat/bind','ChatController@bind');
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
消息队列 CMQ
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档