通常在直播系统源码中,直播间人数是非常重要的统计数据,由于需要统计实时的人数,因此需要如下处理。
1.当用户进入和退出直播间,触发进入和退出直播间的广播,通知客户端增减人数。
2.当新用户进入直播间时,要给该用户提供相应的房间人数的数据
3.在数据库中存储累计人数,用于统计
4.Redis中存储用户列表,方便用户列表的相关功能使用
处理代码如下:
1.进入房间部分
//进入房间
socket.on('conn', function(data) {
if(!data || !data.token){
return !1;
}
userid=data.uid;
old_socket = sockets[userid];
if (old_socket && old_socket != socket) {
if(data.uid != data.roomnum && data.uid==old_socket.roomnum){
/* 进房间 但旧链接是 主播 */
var data_str='{"retmsg":"ok","retcode":"000000","msg":[{"msgtype":"1","_method_":"StartEndLive","action":"19","ct":"直播关闭"}]}';
old_socket.emit('broadcastingListen',[data_str]);
}else if(data.uid== data.roomnum && data.stream==old_socket.stream){
/* 主播重连 */
old_socket.reusing = 1;
//console.log("重用");
}else if(data.uid== data.roomnum && data.stream!=old_socket.stream){
/* 主播多端开播 */
var data_str='{"retmsg":"ok","retcode":"000000","msg":[{"msgtype":"1","_method_":"StartEndLive","action":"19","ct":"直播关闭"}]}';
old_socket.emit('broadcastingListen',[data_str]);
}
old_socket.disconnect()
}
clientRedis.get(data.token,function(error,res){
if(error){
return;
}else if(res==null){
//console.log("[获取token失败]"+data.uid);
}else{
if(res != null){
var userInfo = evalJson(res);
if(userInfo['id'] == data.uid ){
//console.log("[初始化验证成功]--"+data.uid+"---"+data.roomnum+'---'+data.stream);
//获取验证token
socket.token = data.token;
socket.roomnum = data.roomnum;
socket.stream = data.stream;
socket.nicename = userInfo['user_nicename'];
socket.level = userInfo['level'];
socket.avatar = userInfo['avatar'];
socket.sign = Number(userInfo['sign']);
socket.usertype = parseInt(userInfo['usertype']);
socket.uid = data.uid;
socket.reusing = 0;
socket.join(data.roomnum);
sockets[userid] = socket;
socket.emit('conn',['ok']);
if( socket.roomnum!=socket.uid && socket.uid >0 ){
/* 处理有时 无座驾信息会崩溃的问题 */
var car_id='0';
var car_swf='';
var car_swftime='';
var car_words='';
if(userInfo.hasOwnProperty("car")){
var carinfo=userInfo['car'];
if(carinfo.hasOwnProperty("id")){
car_id=carinfo['id'];
}
if(carinfo.hasOwnProperty("swf")){
car_swf=carinfo['swf'];
}
if(carinfo.hasOwnProperty("swftime")){
car_swftime=carinfo['swftime'];
}
if(carinfo.hasOwnProperty("words")){
car_words=carinfo['words'];
}
}
va