package data
{
import com.adobe.serialization.json.JSON;
import flash.events.AsyncErrorEvent;
import flash.events.Event;
import flash.events.EventDispatcher;
import flash.events.NetStatusEvent;
import flash.net.NetConnection;
import flash.net.ObjectEncoding;
import flash.net.Responder;
public class RemotingEegine
{
//URL
private var gateWayUrl:String;//"http://t3.youxigu.com/yxg/messagebroker/amf";
//"http://local.youxigu.com/messagebroker/amf";
private static var RemotingEvent:EventDispatcher = new EventDispatcher();
//链连
private var c_remotingNc:NetConnection;
//返回的数据
private var backDate:String;
//请求的方法
private var m_method:String;
//arrang
private var m_requestList:Array = [];
//arrang 请求单元
private var m_requestAtom:Array = [];
//状态
private var m_state:int;//表示当前的
public function RemotingEegine(_url:String)
{
trace("remoting engine start.........");
gateWayUrl = _url + "messagebroker/amf";
init();
}
private function init():void{
c_remotingNc = new NetConnection();
c_remotingNc.objectEncoding = ObjectEncoding.AMF0;
c_remotingNc.addEventListener(NetStatusEvent.NET_STATUS,netStatus);
c_remotingNc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncError);
}
public function callDate(_method:String, _arg:Array, _function:Function):void{
RemotingEvent.addEventListener(_method, _function);
//arrang
m_requestAtom = [_method, _arg, _function];
m_requestList.push(m_requestAtom);
trace("rangg"+m_requestList.length);
if(m_requestList.length > 1)return;//超过一个以上则不请求,只排队
//
requestStart(m_requestList);
}
//请求数据
private function requestStart(_arr:Array):void{
var _method:String = _arr[0][0];
var _arg:Array = _arr[0][1];
trace("call--remoting");
/* 建立连接 */
c_remotingNc.connect(gateWayUrl);
m_method = _method;
backDate = null;
//call eg:"calculate.add"
if(_arg == null || _arg.length == 0)c_remotingNc.call(_method,new Responder(getMsgResult,getMsgFault));
else if(_arg.length==1)c_remotingNc.call(_method,new Responder(getMsgResult,getMsgFault),_arg[0]);
else if(_arg.length==2)c_remotingNc.call(_method,new Responder(getMsgResult,getMsgFault),_arg[0],_arg[1]);
else if(_arg.length==3)c_remotingNc.call(_method,new Responder(getMsgResult,getMsgFault),_arg[0],_arg[1],_arg[2]);
else if(_arg.length==4)c_remotingNc.call(_method,new Responder(getMsgResult,getMsgFault),_arg[0],_arg[1],_arg[2],_arg[3]);
else if(_arg.length==5)c_remotingNc.call(_method,new Responder(getMsgResult,getMsgFault),_arg[0],_arg[1],_arg[2],_arg[3],_arg[4]);
}
//netStatus
private function netStatus(eve:NetStatusEvent):void{
//
}
//asyncError
private function asyncError(eve:AsyncErrorEvent):void{
//
}
//call back success
private function getMsgResult(_result:*):void{
trace(_result);
backDate = _result;
try{
var t_backDate:Object = JSON.decode(backDate);
if(int(t_backDate.warnMessage) == -999999){
trace("sessionKey"+main3.sessionKey);
//
c_remotingNc.call("petRemotingService.login", new Responder(getMsgResult2,function ():void{trace("session-key-error");}), main3.sessionKey);
return;
}
}catch(e:Error){
trace("JSON.decode(backDate)----error"+m_method);
}
RemotingEvent.dispatchEvent(new Event(m_method));
trace("call back--ok");
trace(m_requestList[0][0]);
c_remotingNc.close();
RemotingEvent.removeEventListener(m_requestList[0][0], m_requestList[0][2]);
trace("removeLis---"+m_requestList[0][0]);
//删除顶端数据
m_requestList.shift();
//若队列还有数据则继续请求
if(m_requestList.length > 0)requestStart(m_requestList);
}
//getID by key---ok
private function getMsgResult2(_result:*):void{
//继续原队列的请求
requestStart(m_requestList);
}
//call back error
private function getMsgFault(_fault:*):void{
RemotingEvent.dispatchEvent(new Event(m_method));
trace("call back--error"+JSON.decode(_fault));
c_remotingNc.close();
RemotingEvent.removeEventListener(m_requestList[0][0], m_requestList[0][2]);
trace("removeLis---"+m_requestList[0][0]);
//删除顶端数据
m_requestList.shift();
//若队列还有数据则继续请求
if(m_requestList.length > 0)requestStart(m_requestList);
}
//backDate interface
public function getBackDate():Object{
var t_backDate:Object = null;
try{
t_backDate = JSON.decode(backDate);
}catch(eve:Error){
trace("JSON--JSON--JSON--JSON--JSON----ERROR"+m_method);
t_backDate = null;
if(m_requestList.length > 0 && m_requestList[0][0] == m_method){
//删除顶端数据
m_requestList.shift();
//若队列还有数据则继续请求
if(m_requestList.length > 0)requestStart(m_requestList);
}
}
return t_backDate;
}
}
}
本文介绍了一个基于 Flash 的 Remoting 引擎实现细节,包括如何通过 NetConnection 进行远程过程调用,错误处理及队列管理机制。文章还展示了如何处理 session 失效情况下的自动重新登录。

被折叠的 条评论
为什么被折叠?



