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配置的
来源:CSDN
作者:会烘焙的工程师
链接:https://blog.csdn.net/weixin_42021688/article/details/103819633