/////////////////////////////////////////////////// ////////////////////// 通道管理 /////////////////// /////////////////////////////////////////////////// var mod_channel = mod_channel || cls_mod.new("mod_channel", "channel", app_server); //最小通道id mod_channel.minid = 100000; //最大通道id mod_channel.maxid = 999999; //可用的通道id列表 mod_channel.ids = []; mod_channel.ids.length = mod_channel.maxid - mod_channel.minid + 1; for (var i = 0; i < mod_channel.ids.length; i++) { mod_channel.ids[i] = mod_channel.minid + i; }; //可用的通道id列表的有效长度 mod_channel.validlen = mod_channel.maxid - mod_channel.minid + 1; //通道列表 mod_channel.list = []; mod_channel.list.length = mod_channel.maxid - mod_channel.minid + 1; mod_channel.test = function(pack){ pack.data = "123456789"; return pack; } //创建 mod_channel.create = function(pack){ //在有效通道id列表中随机数组下标 var idx = min_random(0, mod_channel.validlen - 1); //确定通道id var id = mod_channel.ids[idx]; //将有效数组的最后一个房号移至该位置 if (idx < mod_channel.validlen - 1) { mod_channel.ids[idx] = mod_channel.ids[mod_channel.validlen - 1]; }; mod_channel.ids[mod_channel.validlen - 1] = 0; //有效数组长度减1 mod_channel.validlen = mod_channel.validlen - 1; //根据通道id创建通道 var o_channel = {}; o_channel.id = id; o_channel.plist = []; //谁在通道里面 //添加到通道列表中 mod_channel.list[id - mod_channel.minid] = o_channel; //返回前端 pack.data = {}; pack.data.channelid = id; return pack; } //释放 mod_channel.free = function(pack){ var channelid = parseInt(pack.data.channelid); //通道序号 var idx = channelid - mod_channel.minid; //检查通道id if (idx < 0 || idx >= mod_channel.list.length) { pack.data = {}; pack.data.state = 1; pack.data.error = "通道id不存在"; return pack; } if (!mod_channel.list[idx]) { pack.data = {}; pack.data.state = 1; pack.data.error = "通道id不存在"; return pack; } //释放通道 mod_channel.list[idx] = null; //释放通道id mod_channel.ids[mod_channel.validlen] = channelid; mod_channel.validlen = mod_channel.validlen + 1; //返回前端 pack.data = {}; pack.data.state = 0; return pack; } //加入 mod_channel.join = function(pack){ var channelid = parseInt(pack.data.channelid); //通道序号 var idx = channelid - mod_channel.minid; //检查通道id if (idx < 0 || idx >= mod_channel.list.length) { pack.data = {}; pack.data.state = 1; pack.data.error = "通道id不存在"; return pack; } if (!mod_channel.list[idx]) { pack.data = {}; pack.data.state = 1; pack.data.error = "通道id不存在"; return pack; } o_channel = mod_channel.list[idx]; var p = {}; p.conmode = pack.conmode; p.fromid = pack.fromid; o_channel.plist.push(p); //返回前端 pack.data = {}; pack.data.state = 0; return pack; } //退出 mod_channel.exit = function(pack){ var channelid = parseInt(pack.data.channelid); //通道序号 var idx = channelid - mod_channel.minid; //检查通道id if (idx < 0 || idx >= mod_channel.list.length) { pack.data = {}; pack.data.state = 1; pack.data.error = "通道id不存在"; return pack; } if (!mod_channel.list[idx]) { pack.data = {}; pack.data.state = 1; pack.data.error = "通道id不存在"; return pack; } o_channel = mod_channel.list[idx]; for (var i = 0; i < o_channel.plist.length; i++) { if (o_channel.plist[i]) { if (o_channel.plist[i].fromid == pack.fromid) { o_channel.plist[i] = null; //返回前端 pack.data = {}; pack.data.state = 0; return pack; } } } //返回前端 pack.data = {}; pack.data.state = 1; pack.data.error = "未在通道内"; return pack; } //广播 mod_channel.broadcast = function(pack){ var channelid = parseInt(pack.data.channelid); var content = pack.data.msg; //通道序号 var idx = channelid - mod_channel.minid; //检查通道id if (idx < 0 || idx >= mod_channel.list.length) { pack.data = {}; pack.data.state = 1; pack.data.error = "通道id不存在"; return pack; } if (!mod_channel.list[idx]) { pack.data = {}; pack.data.state = 1; pack.data.error = "通道id不存在"; return pack; } o_channel = mod_channel.list[idx]; for (var i = 0; i < o_channel.plist.length; i++) { if (o_channel.plist[i]) { //广播前端 var msg = {}; msg.app = pack.app; msg.route = pack.route; msg.rpc = pack.rpc; msg.conmode = o_channel.plist[i].conmode; msg.fromid = o_channel.plist[i].fromid; msg.data = {}; msg.data.state = 0; msg.data.msg = content; mod_channel.app.SendPack(msg); } } } //断线 mod_channel.OnTcpDisConnected = function(str_tcpid){ for (var i = 0; i < mod_channel.list.length; i++) { if (mod_channel.list[i]){ for (var j = 0; j < mod_channel.list[i].plist.length; j++) { if (mod_channel.list[i].plist[j]) { if (mod_channel.list[i].plist[j].fromid == str_tcpid) { //广播前端 var msg = {}; msg.app = mod_channel.app.appname; msg.route = mod_channel.routename; msg.rpc = "disconnected"; msg.data = {}; msg.data.channelid = mod_channel.list[i].id; msg.data.idx = j; for (var k = 0; k < mod_channel.list[i].plist.length; k++) { if (k != j){ msg.conmode = mod_channel.list[i].plist[k].conmode; msg.fromid = mod_channel.list[i].plist[k].fromid; mod_channel.app.SendPack(msg); } } return; } } } } } } mod_channel.timer = min_ontime(function(){ mod_channel.ran = min_random(1,100); }, 2000);