上一篇博客我们完成了服务端的基本结构,这一篇博客我们就来把它丰富起来以实现聊天室的功能。
1.整理需求
1.进行三人随机匹配
2.取消匹配
3.发送消息
4.离开房间
5.获取当前在线人数
2.规定消息格式
我们使用json来传递数据
客户端
{
'type' //0 进行匹配 1 取消匹配 2 发送消息 3离开房间
'data':{
'room_id'
'msg'
}
}
主要是type字段,data字段是可选的
服务端
{
'type' //1 匹配成功 2 有人发消息 3 匹配需要等待 4普通消息推送(有人离开) 5普通消息(取消匹配成功) 6 在线人数通知
'data':{
'room_id'
'msg'
}
}
主要是type字段,data字段是可选的
3.代码实现
我们主要做的事就是解析客户端的消息,然后根据不同的type执行不同的函数
首先给WebsocketServer类添加两个新的变量
private $chat_rooms;//所有聊天室
private $wait_users;//等待匹配的用户
然后我们需要一个给同一个聊天室里的人推送消息的函数,和给所用客户端推送消息的函数用来推送在线人数
//同一个聊天室里的用户 广播消息
private function push_msg_for_room($room_id,$msg,$c_socket=null){
if($c_socket){
// 当前用户存在 只把消息推送给其他两个人
$msg=$this->msg_encode(json_encode($msg));
foreach ($this->chat_rooms[$room_id] as $user){
if($user!=$c_socket){
socket_write($user,$msg,strlen($msg));
}
}
}else{
//将消息推送给所有人
$type=$msg['type'];
if($type==1){
//匹配成功消息推送
//随机三个用户信息
$usersinfo=$this->get_3_role();
foreach ($this->chat_rooms[$room_id] as $k=>$user){
$data=array(