差不多一年的时间没有碰FMS了,最近又弄了下。做一个拥有共享画板,在线语音,支持留言,四种权限控制的工具。如果再完善点,可以作为简单的视频会议工具了。其实,最想做的就是做一个有P2P的多人视频唱歌工具。
简单的说下重点,今天先说下怎么处理客户端多处登录的问题。就是这样一个场景。你先登录了一个账号,再登录该账号,会前边一个账号从服务器踢出,同时告诉客户端做相应的处理。
(1)。 先建立好通讯文件。定义一个Array对象,用来放登陆用户的用户名(不放也可以的)。写好函数:application.onAppStart丶application.onAppStop丶application.onConnect丶application.onDisconnect。
实现相同登陆提醒主要是每次登陆前判断该登陆用户名是否已经在服务器上了。具体代码如下,都已经写好了注释。
/** * 写服务器端语句。最好不要定义变量的数据类型。最好都用服务器端时间,这样时间可以统一。 */ var userList; //在这里可以初始化数据 application.onAppStart = function () { userList = new Array(); } //在这里可以收尾数据处理 application.onAppStop = function () { userList = []; } // application.clients 不是array。不能用for each来遍历它。可以用for循环来处理。这个是链接服务器的客户端。 application.onConnect = function(client,userName) { var len = application.clients.length; var time = application.getNowTime(); var i = 0; for( i = 0 ; i< len ; i++) { if(application.clients[i].name == userName) { application.broadcastMsg("sameLogin",userName,time); application.disconnect(clients[i]); return; } } client.name = userName; //这里很重要,将用户名赋值给client对象。 userList.push(userName); application.acceptConnection(client); //接受客户端的连接。 application.broadcastMsg("successLogin",userName,time); //广播一条消息出去。所有的客户端都会收到这个信息。这里带了一个参数,登陆客户的用户名 } Array.prototype.indexOf = function(k) { var len = this.length; var index = -1; for(var i=0;i<len;i++){ if(k == this[i]){ index = i; break; } } return index; } //获取服务器的时间 application.getNowTime = function () { var timedate = new Date(); var hours = timedate.getHours(); var minutes = timedate.getMinutes(); var seconds = timedate.getSeconds(); if(hours < 10) { hours = "0" + hours; } if(minutes < 10) { minutes = "0" + minutes; } if(seconds < 10) { seconds = "0" + seconds; } return hours+":"+minutes+":"+seconds; } //从服务器断开时调用。这个时候需要将用户从数组里边清除掉。并且广播一条消息出来,让所有的客户端知道是谁退出了。 application.onDisconnect = function(client) { //indexOf这个方法,老的FMS不支持,现在好像支持了,不需要手动去定义这个了。 var index = userList.indexOf(client.name); if(index >=0) { userList.splice(index,1); } var time = application.getNowTime(); application.broadcastMsg("loginOut",client.name,time); }
(2)。 再在客户端创建一个连接。在这里client对象最好是一个单独的类,这样方便管理。NetConnection对象最好先封装下。这里就不处理了。连接成功会返回 “NetConnection.Connect.Success”.客户端简单代码如下。
package { import flash.display.Sprite; import flash.events.NetStatusEvent; import flash.net.NetConnection; public class FmsDemo extends Sprite { private var userName:String = "vini"; private var nc:NetConnection; public function FmsDemo() { nc= new NetConnection(); nc.connect("rtmp://localhost/chat",userName); nc.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler); nc.client = this; } private function netStatusHandler(e:NetStatusEvent):void { var code:String = e.info.code; trace(code); switch(code) { case "NetConnection.Connect.Success": trace("链接服务器成功,做你想做的事情吧!"); break; default: break; } } public function sameLogin(userName:String,time:String):void { if(this.userName == userName) { trace(time + " , "+ " 你的账号在别处登录了!"); } else { //更新客户端关于userName的数据 } } public function successLogin(userName:String,time:String):void { trace(time + " , "+ userName + " 登入了!"); } public function loginOut(userName:String,time:String):void { trace(time + " , "+ userName + " 登出了!"); } } }
源文件下载
慢慢会记录FMS简单实用的code。