[FMS] Flash Media Server(5)

7509 단어 .netFlash
오늘 우리가 설명한 것은 어제 코드의 기능에 온라인 리스트의 기능을 추가하는 동시에 공유 대상을 제거하고 다른 방법으로 클라이언트에게 메시지를 보내는 것이다.
먼저 서버 코드를 살펴보겠습니다. 우리가 어떤 코드를 변경했는지:
application.onAppStart = function() { 
    this.chatMsgArray = new Array(); 
    this.userListArray = new Array(); 
} 
  
application.onConnect = function(client, userName) { 
    if(checkOnline(userName)){ 
        this.rejectConnection(client); 
        return; 
    } 
    this.acceptConnection(client); 
    client.userName = userName; 
    this.userListArray.push(userName); 
    sendUserList(); 
    //        
    client.getMsg = function(){ 
        return application.chatMsgArray; 
    } 
    client.sendMsg = function(msg){ 
        var chatInfo = this.userName + " : " + msg; 
        application.chatMsgArray.push(chatInfo); 
        sendMsgToClient(chatInfo); 
    } 
} 
  
application.onDisconnect = function(client) { 
    trace("  :"+client.userName+"   "); 
    var len = this.userListArray.length; 
    for(var i=0;i<len;i++){ 
        if(this.userListArray[i] == client.userName){ 
            this.userListArray.splice(i,1); 
            sendUserList(); 
        } 
    } 
} 
  
  
application.onAppStop = function() { 
    delete this.chatMsg_so; 
} 
  
function checkOnline(userName){ 
    var len = application.userListArray.length; 
    for(var i=0;i<len;i++){ 
        if(application.userListArray[i] == userName){ 
            return true; 
        } 
    } 
    return false; 
} 
  
function sendMsgToClient(chatInfo){ 
    var len = application.clients.length; 
    for(var i=0;i<len;i++){ 
        application.clients[i].call("getMsgInfo",null,chatInfo); 
    } 
} 
  
function sendUserList(){ 
    var len = application.clients.length; 
    for(var i=0;i<len;i++){ 
        application.clients[i].call("getUserList",null,application.userListArray); 
    } 
}

 
 
this.chatMsgArray = new Array();this.userListArray = new Array();
이 두 정의의 수조는 정의하기 시작한 것이다. chatMsgarray는 모든 채팅 정보를 저장하고userListArray는 온라인 목록을 저장하는 수조이다.
사용자가 연결될 때, 우리는 함수 check Online을 사용하여 사용자가 온라인 목록에 있는지 확인하고, 만약 있다면this를 사용합니다.rejectConnection(client);이 연결을 거부합니다. 없으면 이 연결을 받아들여 온라인 목록에 추가합니다.
sendUserList 함수는 클라이언트에게 온라인 목록 정보, 응용 프로그램을 보내는 것입니다.clients는 클라이언트가 연결된 정보를 저장하는 응용 프로그램입니다.clients.call은 클라이언트 함수를 호출하는 것으로 사용 방법은 클라이언트가 서버를 조정하는 것과 같다.
그리고 우리는 클라이언트가 호출할 수 있는 함수를 하나 추가했다
client.getMsg = function(){ 
      return application.chatMsgArray; 
}

 
 
client.getMsg는 모든 채팅 정보를 되돌려주고 사용자가 처음 연결할 때 다른 사람의 채팅 기록을 얻는다
사용자가 연결을 끊을 때 끊긴 사용자를 온라인 목록에서 지우고 온라인 목록을 보냅니다.
클라이언트 코드를 다시 확인합니다.
package net.smilecn.chat{ 
    
    import flash.display.Sprite; 
    import flash.net.NetConnection; 
    import flash.net.Responder; 
    import flash.events.NetStatusEvent; 
    import flash.events.SyncEvent; 
    import flash.events.MouseEvent; 
    import fl.controls.TextArea; 
    import fl.controls.Button; 
    import fl.controls.TextInput; 
    import fl.controls.Label; 
    import fl.controls.List; 
    import fl.data.DataProvider; 
  
    
    public class Chat extends Sprite{ 
        
        private var nc:NetConnection; 
        private var rtmpUrl:String = "rtmp://localhost/chat"; 
        private var msg:Label; 
        private var userNameInput:TextInput; 
        private var enterBtn:Button; 
        private var button:Button; 
        private var textArea:TextArea; 
        private var textInput:TextInput; 
        private var userList:List; 
        
        private var userName:String = "user002"; 
    
        public function Chat():void{ 
            userNameInput = new TextInput(); 
            userNameInput.move(100,200); 
            addChild(userNameInput); 
            enterBtn = new Button(); 
            enterBtn.move(220,200); 
            enterBtn.label = "  "; 
            addChild(enterBtn); 
            enterBtn.addEventListener(MouseEvent.CLICK,enterBtnClickHandler); 
            msg = new Label(); 
            msg.move(100,230); 
            msg.text = ""; 
            addChild(msg); 
        } 
        
        private function enterBtnClickHandler(event:MouseEvent):void{ 
            if(userNameInput.text!=""){ 
                userName = userNameInput.text; 
                removeChild(userNameInput); 
                removeChild(enterBtn); 
                removeChild(msg); 
            
                textArea=new TextArea(); 
                textArea.setSize (200,300); 
                textArea.move (20,20); 
                addChild (textArea); 
  
                textInput=new TextInput(); 
                textInput.width = 140; 
                textInput.move (20,330); 
                addChild (textInput); 
  
                button=new Button(); 
                button.width=50; 
                button.label="  "; 
                button.move (170,330); 
                addChild(button); 
                button.addEventListener (MouseEvent.CLICK,sendMsg); 
                
                userList = new List(); 
                userList.move(250,20); 
                userList.setSize(100,300); 
                addChild(userList); 
            
                nc=new NetConnection(); 
                nc.addEventListener (NetStatusEvent.NET_STATUS,netStatusHandler); 
                nc.connect (rtmpUrl,userName); 
                nc.client = this; 
            }else{ 
                msg.text = "      "; 
            } 
            
        } 
        
        private function netStatusHandler(event:NetStatusEvent):void{ 
            trace("event.info.code:",event.info.code); 
            if(event.info.code == "NetConnection.Connect.Success"){ 
                nc.call("getMsg",new Responder(getMsgResult,getMsgFault)) 
            } 
        } 
        
        private function getMsgResult(re:Array):void{ 
            var s:String=""; 
            var len:Number = re.length; 
            for(var i=0;i<len;i++){ 
                s += re[i]+" "; 
            } 
            textArea.text = s; 
        } 
        
        private function getMsgFault(fe:*):void{ 
            trace(fe); 
        } 
        
        private function sendMsg (e:MouseEvent):void{ 
            nc.call("sendMsg",null,textInput.text); 
            textInput.text = ""; 
        } 
        
        public function getMsgInfo(msg:String):void{ 
            textArea.appendText(msg+" "); 
        } 
        
        public function getUserList(list:Array):void{ 
            userList.dataProvider = new DataProvider(list); 
        } 
    } 
    
}

 
 
클라이언트가 먼저 사용자 입력 이름을 추가했습니다. 이것은 간단한 코드입니다.
그리고 공유 대상의 그 부분을 없애고 이런 코드를 추가했다:nc.client = this;
이 말은 현재 대상을 서버 리셋 방법의 대상으로 지정하는 것을 의미한다
public function getMsgInfo(msg:String):void{ 
       textArea.appendText(msg+"
"); } public function getUserList(list:Array):void{ userList.dataProvider = new DataProvider(list); }

 
 
이 두 가지 방법이 바로 서버를 호출하는 방법이다.
nc 연결에 성공한 곳에 nc를 추가했습니다."getMsg", new Responder(getMsg Result, getMsg Fault))는 연결이 성공했을 때 이전 사용자의 채팅 기록을 얻는 것입니다.
참고로 클라이언트 코드는 구성 요소를 사용했기 때문에 이 구성 요소를 라이브러리에 넣어야만 실행할 수 있다. 지난 절도 마찬가지다.
다음 섹션이 계속됩니다.
(본 강좌는 전재할 필요가 있으면 출처를 밝혀 주십시오!)

좋은 웹페이지 즐겨찾기