关于 聊天室的Event的两个函数问题('sendToCurrentClient'与'sendToGroup'的 区别)?

最新的2.0文档里更新了Event.php,发现里面有各一个地方我不是很理解

// 转播给当前房间的所有客户端,xx进入聊天室 message {type:login, client_id:xx, name:xx}
$new_message = array('type'=>$message_data['type'], 'client_id'=>$client_id, 'client_name'=>htmlspecialchars($client_name), 'time'=>date('Y-m-d H:i:s'));
Gateway::sendToGroup($room_id, json_encode($new_message));
Gateway::joinGroup($client_id, $room_id);

// 给当前用户发送用户列表
$new_message['client_list'] = $clients_list;
Gateway::sendToCurrentClient(json_encode($new_message));


请看 上面代码,以上是在Event的 71行-78行的代码,在这里的sendToCurrentClient(),为什么不用sendToGroup()?,你们看。既然是获取当前在线的用户列表,那我已经上线了,就已经在当前Group里面了,那为什么还要使用sendToCurrentClient()?用sendToGroup()的话,可以一起推送,这样做反而可以减方便很多,你们说呢?所以我不是很理解!

谢谢!
已邀请:

walkor

赞同来自: kaifengjk

两个方法的作用
Gateway::sendToGroup是给某个用户组(这里是房间)的用户连接发送数据
Gateway::sendToCurrentClient是给当前用户连接发送数据。

用户登录数据交互流程
1、先给当前房间所有在线用户广播(Gateway::sendToGroup)有人登录,浏览器收到login数据后将新用户展示到在线列表里面
2、给当前登录的用户单独放送(Gateway::sendToCurrentClient)在房间的线用户列表

为什么当前用户要单独发送?
因为当前用户有个在线用户列表数据。而这个在线列表数据根本不需要发送给其它已经在线的用户,因为他们已经有了这份在线列表数据,只需要增量添加新用户即可。

在线用户列表占用的带宽
在线用户列表数据可能会很大。例如2000人在线,每个用户记录大概50字节,那么这个列表体积可能在100KB左右。

如果这100KB数据广播给所有2000在线用户,那么将占用带宽2000*100KB=200MB=1.6Gbit,没错,需要1.6G的带宽。。。

如果是无差别的实时广播所有在线用户,2000人的聊天室每秒一次的用户登录/退出就轻松把带宽耗光了。

结论
所以只给当前用户发送所有的在线用户列表,其他已经在线的用户只需要更新那一个上线的用户数据。
这就是为什么要分别发送。

要回复问题请先登录注册