• 【设为首页】
  • 【收藏闪客居】
当前位置:主页>FLASH AS 编程>FMS>文章内容
  • 一步一步学Flash Media Server(八)

  • 来源:blog.smilecn.net 作者:arrowyoung 2008-08-08 【

在上一节中,我们将一些方法进一步封装到了UserList类中 了,这样做是有很多好处的,以前经常有朋友问我像聊天室怎么做成多房间,像斗地主怎么做成多个桌子在打,其实原理都是一样的,我们只需要对 UserList类做一些改造,就可以达到这个功能了,首先把类的名字改成ChatRoom,这样更好认一些,先看ChatRoom.asc,是由 UserList.asc改造而来的:

  1. function ChatRoom(id){
  2.     this.id = id;
  3.     this.listArray = [];
  4.     this.chatMsgArray = [];
  5. }
  6.  
  7. ChatRoom.prototype.addUser = function(user){
  8.     this.listArray.push(user);
  9.     this.sendUserList();
  10. }
  11.  
  12. ChatRoom.prototype.delUser = function(userName){
  13.     var len = this.listArray.length;
  14.     for(var i=0;i<len;i++){
  15.         if(this.listArray[i].userName == userName){
  16.             this.listArray.splice(i,1);
  17.             break;
  18.         }
  19.     }
  20.     this.sendUserList();
  21. }
  22.  
  23. ChatRoom.prototype.checkOnline = function(userName){
  24.     var len = this.listArray.length;
  25.     for(var i=0;i<len;i++){
  26.         if(this.listArray[i].userName == userName){
  27.             return true;
  28.         }
  29.     }
  30.     return false;
  31. }
  32.  
  33. ChatRoom.prototype.getUserList = function(){
  34.     var result = [];
  35.     var len = this.listArray.length;
  36.     for(var i= 0;i<len;i++){
  37.         result.push(this.listArray[i].userName);
  38.     }
  39.     return result;
  40. }
  41.  
  42. ChatRoom.prototype.sendUserList = function(){
  43.     sendAllRoomNum(this.id,this.listArray.length);
  44.     var len = this.listArray.length;
  45.     for(var i=0;i<len;i++){
  46.         this.listArray[i].client.call("getUserList",null,this.getUserList());
  47.     }
  48. }
  49.  
  50. ChatRoom.prototype.sendMsgToClient = function(chatInfo){
  51.     trace("sendMsgToClient:"+chatInfo);
  52.     this.chatMsgArray.push(chatInfo);
  53.     var len = this.listArray.length;
  54.     for(var i=0;i<len;i++){
  55.         this.listArray[i].client.call("getMsgInfo",null,chatInfo);
  56.     }
  57. }

来看看ChatRoom类和UserList类有什么区别:
1.在构造中增加了this.id = id,这里的id表示每个房间的编号,这样可以区别当前是哪个房间.
2.this.chatMsgArray,存储聊天信息的数组,之前是放在main.asc里面的,因为之前只有一个房间,而现在有多个房间,所以每个房间都应该有一个自己的聊天信息列表.

main.asc文件也做了相应的修改:

  1. load("ChatRoom.asc");
  2. load("User.asc");
  3. application.onAppStart = function() {
  4.     this.roomArray = [];
  5.     this.roomUserNum = [];
  6.     var roomLen = 3;
  7.     for(var i=0;i< roomLen ;i++){
  8.         this.roomArray.push(new ChatRoom(i+1));
  9.         this.roomUserNum.push(0);
  10.     }
  11. }
  12.  
  13. application.onConnect = function(client) {
  14.     this.acceptConnection(client);
  15.     //客户端调用方法
  16.     client.addRoom = function(userName,roomid){
  17.         trace(userName,roomid);
  18.         var isOnline = application.roomArray[roomid - 1].checkOnline(userName);
  19.         if(!isOnline){
  20.             var user = new User(this,userName,roomid);
  21.             application.roomArray[roomid - 1].addUser(user);
  22.             return true;
  23.         }else{
  24.             return false;
  25.         }
  26.     }
  27.     client.getMsg = function(roomid){
  28.         return application.roomArray[roomid - 1].chatMsgArray;
  29.     }
  30.     client.sendMsg = function(roomid,msg){
  31.         var chatInfo = this.userName + " : " + msg;
  32.         application.roomArray[roomid - 1].sendMsgToClient(chatInfo);
  33.     }
  34.     client.getAllUserNum = function(){
  35.         return application.roomUserNum;
  36.     }
  37. }
  38.  
  39. application.onDisconnect = function(client) {
  40.     trace("用户:"+client.userName+" 离开  "+client.roomid);
  41.     this.roomArray[client.roomid - 1].delUser(client.userName);
  42. }
  43.  
  44.  
  45. application.onAppStop = function() {
  46.    
  47. }
  48.  
  49. function sendAllRoomNum(roomid,num){
  50.     application.roomUserNum[roomid - 1] = num;
  51.     var len = application.clients.length;
  52.     for(var i= 0;i<len ;i++){
  53.         application.clients[i].call("getAllRoomNum",null,application.roomUserNum);
  54.     }
  55. }

在这个类中我们主要做了以下修改:

1.this.roomArray,用来存储每个房间实例的数组;this.roomUserNum,所有房间当前在线人数的数组;在这里我定义了三个房间,这个可以任意设定.
2.在客户端连接进来时,直接接受客户端连接,不做判断,把判断改在addRoom完成.
3.在客户端发过来的消息中,多加了个参数,就是roomid,用于区别是哪个房间发来的消息,然后根据roomid来判断调用哪个房间实例的方法.
4.增加sendAllRoomNum方法,用于发送实时的所有房间人数,供客户端的大厅显示,正常大厅的可以实时看到人数变化.

客户端代码也要做相应的修改:

  1. package net.smilecn.chat{
  2.    
  3.     import flash.display.Sprite;
  4.     import flash.net.NetConnection;
  5.     import flash.net.Responder;
  6.     import flash.events.NetStatusEvent;
  7.     import flash.events.SyncEvent;
  8.     import flash.events.MouseEvent;
  9.     import fl.controls.TextArea;
  10.       import fl.controls.Button;
  11.       import fl.controls.TextInput;
  12.     import fl.controls.Label;
  13.     import fl.controls.List;
  14.     import fl.data.DataProvider;
  15.  
  16.    
  17.     public class Chat extends Sprite{
  18.        
  19.         private var nc:NetConnection;
  20.         private var rtmpUrl:String = "rtmp://localhost/chat/chatLobby";
  21.         private var msg:Label;
  22.         private var userNameInput:TextInput;
  23.         private var enterBtn:Button;
  24.         private var button:Button;
  25.         private var textArea:TextArea;
  26.             private var textInput:TextInput;
  27.         private var userList:List;
  28.        
  29.         private var userName:String;
  30.        
  31.         private var allRoomNum :Array = new Array();
  32.         private var roomBtnArray:Array = new Array();
  33.        
  34.         private var onlineArray:Array = new Array();
  35.        
  36.         private var currentRoomid:Number;
  37.    
  38.         public function Chat():void{
  39.             userNameInput = new TextInput();
  40.             userNameInput.move(100,200);
  41.             addChild(userNameInput);
  42.             enterBtn = new Button();
  43.             enterBtn.move(220,200);
  44.             enterBtn.label = "进入";
  45.             addChild(enterBtn);
  46.             enterBtn.addEventListener(MouseEvent.CLICK,enterBtnClickHandler);
  47.             msg = new Label();
  48.             msg.move(100,230);
  49.             msg.text = "";
  50.             addChild(msg);
  51.         }
  52.        
  53.         private function enterBtnClickHandler(event:MouseEvent):void{
  54.             if(userNameInput.text!=""){
  55.                 userName = userNameInput.text;
  56.                 nc=new NetConnection();
  57.                         nc.addEventListener (NetStatusEvent.NET_STATUS,netStatusHandler);
  58.                 nc.client = this;
  59.                 nc.connect (rtmpUrl);
  60.                
  61.             }else{
  62.                 msg.text = "请输入用户名";
  63.             }
  64.            
  65.         }
  66.        
  67.         private function netStatusHandler(event:NetStatusEvent):void{
  68.             trace(event.info.code);
  69.             switch (event.info.code) {
  70.                 case "NetConnection.Connect.Success" :
  71.                     trace("连接成功!");
  72.                     nc.call("getAllUserNum",new Responder(getAllUserNumResult,getAllUserNumFault))
  73.                     break;
  74.                 case "NetConnection.Connect.Rejected" :
  75.                     trace("连接被拒绝!");
  76.                     break;
  77.                 case "NetConnection.Connect.Failed" :
  78.                     trace("连接失败!");
  79.                     break;
  80.                 case "NetConnection.Connect.Closed" :
  81.                     trace("连接关闭!");
  82.                     break;
  83.             }
  84.         }
  85.        
  86.         private function getAllUserNumResult(re:Array):void{
  87.             trace("getAllUserNumResult:"+re);
  88.             removeChild(userNameInput);
  89.             removeChild(enterBtn);
  90.             removeChild(msg);
  91.             allRoomNum = re;
  92.             var xpos = 100;
  93.             var ypos = 200;
  94.             var num = 150;
  95.             var len = allRoomNum.length;
  96.             for(var i=0 ;i<len;i++){
  97.                 var btn:Button = new Button();
  98.                 btn.x = xpos;
  99.                 btn.y = ypos;
  100.                 xpos += num;
  101.                 btn.label = (i+1) + "号房间("+allRoomNum[i]+"/"+(i+1) * 10 + ")";
  102.                 addChild(btn);
  103.                 btn.addEventListener(MouseEvent.CLICK,roomBtnHandler);
  104.                 roomBtnArray.push(btn);
  105.             }
  106.         }
  107.        
  108.        
  109.         private function getAllUserNumFault(fe:*):void{
  110.             trace(fe);
  111.         }
  112.        
  113.         private function intoRoom():void{
  114.             var len = roomBtnArray.length;
  115.             for(var i=0;i<len;i++){
  116.                 removeChild(roomBtnArray[i]);
  117.             }
  118.             roomBtnArray = [];
  119.             textArea=new TextArea();
  120.             textArea.setSize (200,300);
  121.                    textArea.move (20,20);
  122.                     addChild (textArea);
  123.  
  124.                     textInput=new TextInput();
  125.             textInput.width = 140;
  126.                     textInput.move (20,330);
  127.                     addChild (textInput);
  128.  
  129.                    button=new Button();
  130.                     button.width=50;
  131.                    button.label="发送";
  132.                    button.move (170,330);
  133.             addChild(button);
  134.             button.addEventListener (MouseEvent.CLICK,sendMsg);
  135.                
  136.             userList = new List();
  137.             userList.move(250,20);
  138.             userList.setSize(100,300);
  139.             addChild(userList);
  140.             userList.dataProvider = new DataProvider(onlineArray);
  141.             nc.call("getMsg",new Responder(getMsgResult,getMsgFault),currentRoomid);
  142.         }
  143.        
  144.         private function getMsgResult(re:*):void{
  145.             var msg:String = "";
  146.             var len:Number = re.length;
  147.             for(var i=0;i<len;i++){
  148.                 msg += re[i]+"\n";
  149.             }
  150.             textArea.text = msg;
  151.         }
  152.        
  153.         private function getMsgFault(fe:*):void{
  154.            
  155.         }
  156.        
  157.         private function roomBtnHandler(event:MouseEvent):void{
  158.             var roomid = Number(event.currentTarget.label.substr(0,1));
  159.             if(allRoomNum[roomid - 1] == roomid * 10){
  160.                 event.currentTarget.label = "此房间已满";
  161.             }else{
  162.                 nc.call("addRoom",new Responder(addRoomResult,addRoomFault),userName,roomid);
  163.                 currentRoomid = roomid;
  164.             }
  165.         }
  166.        
  167.         private function addRoomResult(re:*):void{
  168.             trace(re);
  169.             if(re){
  170.                 intoRoom();
  171.             }
  172.         }
  173.        
  174.         private function addRoomFault(fe:*):void{
  175.            
  176.         }
  177.        
  178.         private function sendMsg (e:MouseEvent):void{
  179.             nc.call("sendMsg",null,currentRoomid,textInput.text);
  180.             textInput.text = "";
  181.         }
  182.        
  183.         public function getMsgInfo(msg:String):void{
  184.             textArea.appendText(msg+"\n");
  185.         }
  186.        
  187.         public function getUserList(list:Array):void{
  188.             trace("getuserList:"+list);
  189.             onlineArray = list;
  190.             if(userList){
  191.                 userList.dataProvider = new DataProvider(onlineArray);
  192.             }
  193.         }
  194.        
  195.         public function getAllRoomNum(array:Array):void{
  196.             allRoomNum = array;
  197.             var len = roomBtnArray.length;
  198.             if(len > 0){
  199.                 for(var i=0;i<len;i++){
  200.                     roomBtnArray[i].label = (i+1) + "号房间("+allRoomNum[i]+"/"+(i+1) * 10 + ")";
  201.                 }
  202.             }
  203.         }
  204.        
  205.         public function close():void{
  206.            
  207.         }
  208.     }
  209.    
  210. }

客户端增加一个大厅,然后再进房间,客户端的代码我就不详细讲解了,因为这不是一个讲AS3的教程,会一些AS3的朋友应该都看得懂,如果不懂,可 以先看一下我写的关于AS3的教程,这个客户端代码写得有点乱,只是完成了功能,FMS的教程写完后,我准备写一些关了MVC框架的使用教程,像 cairngorm和pureMVC,到时会将代码处理得更好些.

下节继续.

(本教程如需转载请注明出处!)




上一篇:一步一步学Flash Media Server(七)   下一篇:Flash Media Server 3.0.2更新
  • 用户名:新注册) 密码: 匿名评论
  • 评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)

Copyright © 2006-2008 flashas.net All Rights Reserved.
网站内容咨询: admin#flashas.net (#为@) 联系QQ:40777822 浙ICP备06033001号
(本网站最佳浏览解析度为1024*768, 建议使用IE 6.0或以上版本浏览器。)