通过一个账户验证的例子演示FMS服务器端和客户端互相调用

流程如下:
1. 客户端在连接时提供账户信息用于验证
2. 服务器端进行账户信息验证
3. 如果验证成功调用客户端的onLoginOKCBS方法将一句问候语作为onLoginOKCBS的参数传递给客户端,
    同时onLoginOKCBS返回一句问候语给服务器端
4. 如果验证失败返回账户错误信息
5. 客户端调用服务器端的getInfoFromSrvCBC方法传入id为10005的消息参数获取服务器端当前时间

服务器端main.asc完整代码:

var error = {"details":"Please provide the correct user name and password!"};
var greeting="Welcome to our humble abode!"
;

application.onConnect 
= function
(clientObj, userinfo)
{
    
if( (userinfo != null&& userinfo.username=='admin' && userinfo.userpwd=='admin'
 )
    {
        application.acceptConnection(clientObj);
        
//call定义在客户端NetConnection.client对象中的onLoginOKCBS

        clientObj.call("onLoginOKCBS"new loginOKHandler(), greeting);
        
        
//定义给客户端调用的方法getInfoFromSrvCBC, 

        //var msg:Object = {"id":10005, "details":"GET_SRV_TIME"};
        clientObj.getInfoFromSrvCBC = function(msg)
        {
            
var
 retval;
            
switch
(msg.id)
            {
                
case 10005:    //获取系统时间

                    trace("msg.details: "+msg.details);
                    retval 
= new
 Date();
                    
break
;
            }
            
return
 retval;
        }
    }
    
else

    {
        application.rejectConnection(clientObj, error);
    }
};

loginOKHandler 
= function()
{
    
this.onResult = function(res)    //获取onLoginOKCBS的返回值

    { 
        trace(
"client said: " +
 res); 
    } 
    
this.onStatus = function
(info)
    { 
        trace(
"Failed with code: " +
 info.code); 
    } 
};

 
客户端main.mxml部分关键代码:

            private function init():void
            {
                
this.nc = new NetConnection();
                
this.nc.client = this;        //指示应对其调用回调方法的对象

                this.nc.addEventListener(NetStatusEvent.NET_STATUS, onNetStatus);
            }
            
            private 
function onNetStatus(event:NetStatusEvent):void

            {
                trace(event.info.code);
                
switch(event.info.code)
                {
                    
case "NetConnection.Connect.Success"
:
                        
this.currentState = "LoginOKState"
;
                        
break
;
                    
                    
case "NetConnection.Connect.Failed"
:
                        
break
;
                        
                    
case "NetConnection.Connect.Rejected"
:
                        
var rejreason:String =
 event.info.application.details;
                        Alert.show(rejreason, 
"ERROR"
);
                        
break
;
                        
                    
case "NetConnection.Connect.Closed"
:
                        
this.currentState = null
;
                        
break
;
                }
            }            
            
            public 
function close():void
{}
            
            
//登入成功后由服务器端调用, obj为服务器端返回的欢迎信息

            public function onLoginOKCBS(obj:Object):String
            {
                
this.lblSrvNotice.text =
 obj.toString();
                
return "I just want to begin"
;
            }
            
            private 
function onBtnGetSrvTimeClick():void

            {
                
this.responder = new Responder(onResult, onStatus);
                
var msg:Object = {"id":10005"details":"GET_SRV_TIME"
};
                
this.nc.call("getInfoFromSrvCBC"this
.responder, msg);
            }
            
            private 
function onResult(obj:Object):void

            {
                
this.tbSrvTime.text = obj.toString();
            }
            
            private 
function onStatus(obj:Object):void

            {
                
var errcode:String = obj.code.toString();
                Alert.show(
"error code:" + errcode, "ERROR"
);
            }
            
            private 
function onBtnLoginClick():void

            {
                
var username:String = this.tbUserName.text;
                
var userpwd:String = this
.tbUserPwd.text;
                
var userinfo:Object = {"username":username, "userpwd"
:userpwd};
                
this.nc.connect(this
.srvurl, userinfo);
            }


工程文件下载(包含客户端和服务器端完整代码):https://files.cnblogs.com/riafans/LoginDemo.zip

posted @ 2011-01-18 15:02  rob_2010  阅读(384)  评论(0编辑  收藏  举报