在之前的文章【laravel中Websocket基本使用】中我们已经初步搭建了websocket服务,现在我们只需要稍微修改一下Events即可 当连接成功时我们将客户端id发送的客户端
<?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)
{
}
}
用户绑定上线
<?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);
}
...
发送消息
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()
];
}
接受为接受消息
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);
}
路由
//socket
// 发送消息
Route::post('chat/send','ChatController@send');
// 接收未接受信息
Route::post('chat/get','ChatController@get');
// 绑定上线
Route::post('chat/bind','ChatController@bind');