GatewayWorker 使用记录

萝らか妹 提交于 2020-01-14 01:09:05

1.重新发送新请求 先获取id和uid进行绑定 在进行其操作
1.下载GatewayWorker
2。移动到更目录
3.进入/home/wwwroot/yunxc/GatewayWorker/Applications/YourApp2页面更改Events.php
在这里插入图片描述里面改为这样

     * @param int $client_id 连接id
     */
    public static function onConnect($client_id)
    {
        // 重新发送新请求 先获取id和uid进行绑定 在进行其操作
        Gateway::sendToClient($client_id, json_encode(array(
            'type'      => 'inits',
            'client_id' => $client_id
        )));
        // 向当前client_id发送数据 
        // Gateway::sendToClient($client_id, "Hello $client_id\r\n");
        // // 向所有人发送
        // Gateway::sendToAll("$client_id login\r\n");
    }

在这里插入图片描述这时启动GatewayWorker php start.php start -d
手册http://doc2.workerman.net/start-and-stop.html
在前端监听启动的端口、
在这里插入图片描述


<script language="javascript" type="text/javascript">
    var live_id=$('#live_id').val()
    // 与GatewayWorker建立websocket连接,域名和端口改为你实际的域名端口
    // ws = new WebSocket("wss://127.0.0.1:8383");
    // ws = new WebSocket("ws://120.78.220.86:8383");
    ws = new WebSocket("wss://www.yun-live.com:446");

    console.log('wx',ws)
    // 服务端主动推送消息时会触发这里的onmessage
    ws.onmessage = function(e){
      console.log('wx',e)
        // json数据转换成js对象
        var data = eval("("+e.data+")");
        var type = data.type || '';
         console.log('type',type)
        switch(type){
            case 'inits':
                getinfochat_a(data.client_id);
                  Obj.start(); 
                break;
            case 'users': //3. 查询在线用户
                 console.log('data',data)
                 $('.tagsl').text(data.count)
                break;
            case 'say': //4 提示进入聊天室
                 console.log('data',data)
                   //此格式与dataa.js的数据格式必须一致
                  var addVal = {
                    img : data.data.avatarUrl,
                    text : data.data.content
                  }
                  //添加进数组
                  Obj.data.unshift(addVal); //
                  Obj.start(); 
                   datalength++
                break;
            // default :
                // alert(e.data);
        }
    };

    // 绑定用户 通知所有人
    function getinfochat_a (client_id) {
      $.post('/getinfochat_a',{client_id:client_id,live_id:live_id,'_token':'{{csrf_token()}}'},function (e) {
        console.log(e)
      })
    }


</script>

d然后在后台监听到数据进行操作
下面群聊的写法

<?php

namespace App\Http\Controllers\H5;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use GatewayClient\Gateway;
use Auth;


class WebsocketController extends Controller
{

	public function __construct()
	{
		Gateway::$registerAddress = '127.0.0.1:1248'; //进入就修改端口统一
		// Gateway::$registerAddress = '127.0.0.1:1238'; //进入就修改端口统一
		// Gateway::$registerAddress = '127.0.0.1:1238'; //进入就修改端口统一
	}




	// 群聊

	// 聊天获取用户信息
	public function getinfochat_a()
	{
		
		// $uid=Request()->post('uid'); //用户ID
		// $nickName=Request()->post('nickName'); //用户ID
		// $avatarUrl=Request()->post('avatarUrl'); //用户ID
		$uid=(int)session('uid'); //用户ID
		$nickName=$this->toidinfo($uid); //用户ID
		$avatarUrl=$this->infopic($uid); //用户头像
		// var_dump($nickName);exit;
		$client_id=Request()->post('client_id'); //聊天ID
		$room_id=Request()->post('live_id'); //房间ID或会议ID
		// var_dump($client_id);exit;
		//1 绑定用户
		$this->bind($client_id,$uid,$nickName,$avatarUrl,$room_id);
		//2 查询最新的5条记录 //只有让自己看见,其他人。看不见的
		//向uid绑定的所有在线client_id发送数据。
		//注意:默认uid与client_id是一对多的关系,如果当前uid下绑定了多个client_id,则多个client_id对应的客户端都会收到消息,这类似于PC QQ和手机QQ同时在线接收消息。

		// Gateway::sendToUid($uid,json_encode($data));  //只有让自己看见,其他人。看不见的

		//3. 查询在线用户
		$this->users($room_id);

		//4 提示进入聊天室
		$this->sendts($avatarUrl,$nickName,$room_id);
	}
	//3. 查询在线用户 
	public function users($room_id)
	{
		$data=[
			'type'=>'users',
			'data'=>Gateway::getAllClientSessions(), //获取当前所有在线client_id信息。
			'count'=>count(Gateway::getAllClientSessions()), //获取当前所有在线client_id信息。
		];
		// Gateway::sendToAll(json_encode($data));//发送至前端用户
		Gateway::sendToGroup($room_id,json_encode($data));//发送到指定房间的数据
	}
	//1 绑定用户
	public function bind($client_id,$uid,$nickName,$avatarUrl,$room_id)
	{
		Gateway::bindUid($client_id,$uid); //用户ID和聊天ID结合
		
		// 当前用户进入哪个组 或房间
		Gateway::joinGroup($client_id, $room_id);
		//把用户信息存入缓存 //实现在线用户读取
		Gateway::setSession($client_id,[
				'room_id'=>$room_id,
				'uid'=>$uid,
				'avatarUrl'=>$avatarUrl,
				'nickName'=>$nickName,
				'time'=>date('Y-m-d H:i:s',time())
		]); 

	}

	//4 提示进入聊天室
	public function sendts($avatarUrl,$nickName,$room_id)
	{
		//4 提示进入聊天室
		$data=[
			'type'=>'say',
			'data'=>[
				'room_id'=>$room_id, //房间ID
				'avatarUrl'=>$avatarUrl,
				'nickName'=>$nickName,
				'type'=>'text',
				'content'=>'欢迎'.$nickName.'进入会议',
				'time'=>date('Y-m-d H:i:s',time())
			]
		];
		// Gateway::sendToAll(json_encode($data));//发送至前端用户
		Gateway::sendToGroup($room_id,json_encode($data));//发送到指定房间的数据
	}



	// 发送聊天记录进行通知
	public function chats_add()
	{
		$uid=(int)session('uid'); //用户ID
		$nickName=$this->toidinfo($uid); //用户ID
		$avatarUrl=$this->infopic($uid); //用户头像

		$users_id=Request()->post('users_id'); //私聊用户ID
		$users_name=Request()->post('users_name'); //私聊用户ID
	
		$content=Request()->post('content'); //内容
		$room_id=Request()->post('room_id'); //房间ID或会议ID

		// 通知聊天消息
		$data=[
			'type'=>'say',
			'data'=>[
				'room_id'=>$room_id, //房间ID
				'avatarUrl'=>$avatarUrl,
				'nickName'=>$nickName,
				'type'=>'text',
				'content'=>$content,
				'time'=>date('Y-m-d H:i:s',time())
			]
		];

		//添加私聊 选择了用户说明是私聊 
		if(!empty($users_id)){
			$data['data']['nickName']=$nickName.'对'.$users_name.'说';
			// var_dump('进入私聊',$data);
			Gateway::sendToUid($uid,json_encode($data));//发送至前端用户   发送对象
			Gateway::sendToUid($users_id,json_encode($data));//发送至前端用户 接受对象
			

			//也可存入数据库
			return;

		}
		// Gateway::sendToAll(json_encode($data));//发送至前端用户 
		Gateway::sendToGroup($room_id,json_encode($data));//发送到指定房间的数据

		//把聊天记录存入数据库。  
		// $data=[
		// 	'type'=>'say',
		// 	'data'=>[
		// 		'room_id'=>$room_id, //房间ID
		// 		'avatarUrl'=>$avatarUrl,
		// 		'nickName'=>$nickName,
		// 		'type'=>'text',
		// 		'content'=>$content,
		// 		'time'=>date('Y-m-d H:i:s',time())
		// 	]
		// ];

	}



	           /**
     * 获取毫秒级别的时间戳
     */
    public function getMsecTime()
    {
        list($msec, $sec) = explode(' ', microtime());
        $msectime =  (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
        return $msectime;
    }


	// 获取头像
	public function infopic($fromid)
	{
		$fromidinfo=Db::table('users')->where('id',$fromid)->first();
		$a=json_encode($fromidinfo);
		$list = json_decode($a, true);
		return $list['avatar'];
	}

	//获取名称
	public function toidinfo($toid)
	{
		$toinfo=Db::table('users')->where('id',$toid)->first();
		$a=json_encode($toinfo);
		$list = json_decode($a, true);
		return $list['alias'];
	}












}

使用思路是
用户进入页面发送请求init请求到后台接收到init
在init里面进行其他的操作
在这里插入图片描述
r’d
如果要变为wss的看我nginx配置的

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!