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

2022-09-08 16:30:09 浏览数 (1)

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

代码语言:javascript复制
<?php

namespace AppWorkerman;
use GatewayWorkerLibGateway;
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 AppHttpControllersApiV1;
use TymonJWTAuthExceptionsTokenExpiredException;
use TymonJWTAuthFacadesJWTAuth;
use IlluminateHttpRequest;
use AppHttpRequestsApiV1ChatRequest;
use AppHttpRequestsApiV1ChatBindRequest;
use GatewayWorkerLibGateway;
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');

0 人点赞