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

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

在上一节中,我们学会了在FMS中使用类,虽然不是正式意义上的类,但也会使我们的程序看起来更结构化,这一节我们继续用类的方式改造之前的代码,首先我们要加个用户类(User.asc):

  1. function User(client,userName){
  2.     this.client = client;
  3.     this.userName = this.client.userName = userName;
  4. }

很简单的一个类,只有构造,没有方法,其实是当用户的信息更多时,我们通常会将用户的所有信息都封装起来,这样便于我们使用,这里我们只是比前面多加了一个client对象,这个对象是代表连接进来的客户端,我们把它封装到User里面.

接着,UserList.asc也要做相应该的修改,并且把之前在main.asc里面的sendUserList和sendMsgToClient也封装到UserList这个类中.

  1. function UserList(){
  2.     this.listArray = [];//也可以用new Array(),不过听说[]效率更高;
  3. }
  4.  
  5. UserList.prototype.addUser = function(user){
  6.     this.listArray.push(user);
  7.     this.sendUserList();
  8. }
  9.  
  10. UserList.prototype.delUser = function(userName){
  11.     var len = this.listArray.length;
  12.     for(var i=0;i<len;i++){
  13.         if(this.listArray[i].userName == userName){
  14.             this.listArray.splice(i,1);
  15.             break;
  16.         }
  17.     }
  18.     this.sendUserList();
  19. }
  20.  
  21. UserList.prototype.checkOnline = function(userName){
  22.     var len = this.listArray.length;
  23.     for(var i=0;i<len;i++){
  24.         if(this.listArray[i].userName == userName){
  25.             return true;
  26.         }
  27.     }
  28.     return false;
  29. }
  30.  
  31. UserList.prototype.getUserList = function(){
  32.     var result = [];
  33.     var len = this.listArray.length;
  34.     for(var i= 0;i<len;i++){
  35.         result.push(this.listArray[i].userName);
  36.     }
  37.     return result;
  38. }
  39.  
  40. UserList.prototype.sendUserList = function(){
  41.     var len = this.listArray.length;
  42.     for(var i=0;i<len;i++){
  43.         this.listArray[i].client.call("getUserList",null,this.getUserList());
  44.     }
  45. }
  46.  
  47. UserList.prototype.sendMsgToClient = function(chatInfo){
  48.     var len = this.listArray.length;
  49.     for(var i=0;i<len;i++){
  50.         this.listArray[i].client.call("getMsgInfo",null,chatInfo);
  51.     }
  52. }

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

1.在addUser里传进来的参数是一个User对象,我们的列表里存的是每个人的对象,而不是以前的只一个userName了.
2.在delUser里,我们做比较的是列表里对象的userName和传进来的参数
3.getUserList方法中我们要把每个人的名字筛选出来
4.将sendUserList和sendMsgToClient封装进来,因为我们的用户对象中有Client,所以直接用this.listArray[i].client就可以调用客户端方法了.
5.在addUser和delUser后通过this.sendUserList()来发送在线列表.

通过将一些方法封装进来,我们发现main.asc的代码减少了,这是好处之一,还有一个好处在后面的教程中会讲到.

最后来看一下main.asc文件:

  1. load("UserList.asc");
  2. load("User.asc");
  3. application.onAppStart = function() {
  4.     this.chatMsgArray = new Array();
  5.     this.userList = new UserList();
  6. }
  7.  
  8. application.onConnect = function(client, userName) {
  9.     if(this.userList.checkOnline(userName)){
  10.         this.rejectConnection(client,{msg:"error1"});
  11.         return;
  12.     }
  13.     this.acceptConnection(client);
  14.     var user = new User(client,userName);
  15.     this.userList.addUser(user);
  16.     //客户端调用方法
  17.     client.getMsg = function(){
  18.         return application.chatMsgArray;
  19.     }
  20.     client.sendMsg = function(msg){
  21.         var chatInfo = this.userName + " : " + msg;
  22.         application.chatMsgArray.push(chatInfo);
  23.         application.userList.sendMsgToClient(chatInfo);
  24.     }
  25. }
  26.  
  27. application.onDisconnect = function(client) {
  28.     trace("用户:"+client.userName+" 离开");
  29.     this.userList.delUser(client.userName);
  30. }
  31.  
  32.  
  33. application.onAppStop = function() {
  34.    
  35. }

在main.asc中减少了两个方法,并且多了一个load(”User.asc”)将User.asc载入进来

在接受用户后,新建了一个User对象 — var user = new User(client,userName);

还有一个改动就是:this.rejectConnection(client,{msg:”error1″});

我们在用户已经列表中拒绝用户加了一个参数,当你有不同的拒绝信息时,这个参数会起很大的作用

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

  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";
  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.         public function Chat():void{
  32.             userNameInput = new TextInput();
  33.             userNameInput.move(100,200);
  34.             addChild(userNameInput);
  35.             enterBtn = new Button();
  36.             enterBtn.move(220,200);
  37.             enterBtn.label = "进入";
  38.             addChild(enterBtn);
  39.             enterBtn.addEventListener(MouseEvent.CLICK,enterBtnClickHandler);
  40.             msg = new Label();
  41.             msg.move(100,230);
  42.             msg.text = "";
  43.             addChild(msg);
  44.         }
  45.        
  46.         private function enterBtnClickHandler(event:MouseEvent):void{
  47.             if(userNameInput.text!=""){
  48.                 userName = userNameInput.text;
  49.                 nc=new NetConnection();
  50.                         nc.addEventListener (NetStatusEvent.NET_STATUS,netStatusHandler);
  51.                 nc.client = this;
  52.                 nc.connect (rtmpUrl,userName);
  53.                
  54.             }else{
  55.                 msg.text = "请输入用户名";
  56.             }
  57.            
  58.         }
  59.        
  60.         private function into():void{
  61.             removeChild(userNameInput);
  62.             removeChild(enterBtn);
  63.             removeChild(msg);
  64.            
  65.             textArea=new TextArea();
  66.             textArea.setSize (200,300);
  67.             textArea.move (20,20);
  68.             addChild (textArea);
  69.  
  70.             textInput=new TextInput();
  71.             textInput.width = 140;
  72.             textInput.move (20,330);
  73.             addChild (textInput);
  74.  
  75.                    button=new Button();
  76.             button.width=50;
  77.                    button.label="发送";
  78.                    button.move (170,330);
  79.             addChild(button);
  80.             button.addEventListener (MouseEvent.CLICK,sendMsg);
  81.                
  82.             userList = new List();
  83.             userList.move(250,20);
  84.             userList.setSize(100,300);
  85.             addChild(userList);
  86.         }
  87.        
  88.         private function netStatusHandler(event:NetStatusEvent):void{
  89.             trace(event.info.code);
  90.             switch (event.info.code) {
  91.                 case "NetConnection.Connect.Success" :
  92.                     trace("连接成功!");
  93.                     into();
  94.                     nc.call("getMsg",new Responder(getMsgResult,getMsgFault))
  95.                     break;
  96.                 case "NetConnection.Connect.Rejected" :
  97.                     trace("连接被拒绝!:"+event.info.application.msg);
  98.                     if(event.info.application.msg == "error1"){
  99.                         msg.text = "用户已在列表中";
  100.                     }
  101.                     break;
  102.                 case "NetConnection.Connect.Failed" :
  103.                     trace("连接失败!");
  104.                     break;
  105.                 case "NetConnection.Connect.Closed" :
  106.                     trace("连接关闭!");
  107.                     break;
  108.             }
  109.         }
  110.        
  111.         private function getMsgResult(re:Array):void{
  112.             var s:String="";
  113.             var len:Number = re.length;
  114.             for(var i=0;i<len;i++){
  115.                 s += re[i]+"\n";
  116.             }
  117.             textArea.text = s;
  118.         }
  119.        
  120.         private function getMsgFault(fe:*):void{
  121.             trace(fe);
  122.         }
  123.        
  124.         private function sendMsg (e:MouseEvent):void{
  125.             nc.call("sendMsg",null,textInput.text);
  126.             textInput.text = "";
  127.         }
  128.        
  129.         public function getMsgInfo(msg:String):void{
  130.             textArea.appendText(msg+"\n");
  131.         }
  132.        
  133.         public function getUserList(list:Array):void{
  134.             userList.dataProvider = new DataProvider(list);
  135.         }
  136.        
  137.         public function close():void{
  138.            
  139.         }
  140.     }
  141.    
  142. }

代码比较简单,不用多讲解了,发布看一下效果,效果跟前几节还是一样,只是多了一个”用户已在列表中的提示”

下节继续.

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




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

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