AsWing 与 Java 之间的交互

 

Web2.0 成就了AJAX,也促进了新技术在 RIA 行业的不断演进,这之后出现的Adobe Flex AIR Microsoft SilverLight尤为突出,至于这两种技术之间的优劣在此不做比较。

作为实用主义者,在我看来能更快速、更好地帮助客户解决问题的技术,那就是好的技术。072月的一个时间萌生了重新架构IMX即时通讯客户端的想法,技术选型上我很看好Adobe Apollo 可人家还未发任何版,好在老朱帮我从Adobe 内部拿到了一份正在开发中的Apollo版本,试用后效果还是很不错的,那会,估计我该是国内最早看到Apollo 真身的几个外部开发人员之一吧。

 

呵呵,就这样有意无意的开始了AS3的开发了, Java 程序员来做 AS3 的开发,初学的人们问的最多的那句,便是二者之间该如何进行交互,如果您也关心于这个部分,OK,那这篇文章就是为您而生。   

 

demo

 

围绕气象服务,支持 http 、hessian 、amf3 多种接口实现,UI部分采用 AsWing 来开发,至于什么是AsWing ,详情见《AsWing 简介》。 

 

package { 

    import c2s.Amf3ServiceInvoker; 

    import c2s.HessianServiceInvoker; 

    import c2s.HttpServiceInvoker; 

     

    import flash.display.Sprite; 

     

    import hessian.events.HessianErrorEvent; 

    import hessian.events.HessianResultEvent; 

     

    import org.aswing.AsWingManager; 

    import org.aswing.FlowLayout; 

    import org.aswing.JButton; 

    import org.aswing.JFrame; 

    import org.aswing.JOptionPane; 

    import org.aswing.JTextField; 

    import org.aswing.event.AWEvent; 

     

    public class aswing2java extends Sprite 

    { 

       private var myFrame:JFrame; 

     

    private var myAmf3Button:JButton; 

    private var myHessianButton:JButton; 

    private var myHttpButton:JButton; 

     

    private var myInput : JTextField; 

     

       public function aswing2java() 

       {                           

           AsWingManager.initAsStandard(this); 

     

            myAmf3Button = new JButton(“amf3″); 

            myAmf3Button.addActionListener(__amf3buttonClicked); 

             

            myHessianButton = new JButton(“hessian”); 

            myHessianButton.addActionListener(__hessianbuttonClicked); 

             

            myHttpButton = new JButton(“http”); 

            myHttpButton.addActionListener(__httpbuttonClicked); 

             

            myInput = new JTextField(合肥,15); 

             

            myFrame = new JFrame(this, 气象服务); 

            myFrame.getContentPane().setLayout(new FlowLayout()); 

            myFrame.getContentPane().append(myInput); 

            myFrame.getContentPane().append(myAmf3Button); 

            myFrame.getContentPane().append(myHessianButton); 

            myFrame.getContentPane().append(myHttpButton); 

             

            myFrame.setSizeWH(300, 200); 

            myFrame.show();               

       } 

        

       public function amf3Result(event : Object) : void { 

           JOptionPane.showMessageDialog(“amf3 “, String(event)); 

       } 

        

       public function amf3Error(event : Object) : void {           

       } 

        

       public function hessianResult(event :HessianResultEvent):void{ 

           JOptionPane.showMessageDialog(“hessian “, String(event.result)); 

       } 

        

       public function hessianError(event :HessianErrorEvent):void{ 

       } 

        

       public function httpResult(event : Object) : void { 

           JOptionPane.showMessageDialog(“http “, String(event)); 

       } 

        

       public function httpError(event : Object) : void {           

       } 

            

       private function __amf3buttonClicked(e:AWEvent):void {          

           var amf3ServiceInvoker: Amf3ServiceInvoker = new Amf3ServiceInvoker(amf3Result, amf3Error);           

           amf3ServiceInvoker.getWeather2(myInput.getText());          

       } 

        

       private function __hessianbuttonClicked(e:AWEvent):void { 

           var hessianServiceInvoker : HessianServiceInvoker = new HessianServiceInvoker(hessianResult, hessianError);  

        hessianServiceInvoker.getWeather2(myInput.getText()); 

       } 

        

       private function __httpbuttonClicked(e:AWEvent):void { 

           var httpServiceInvoker : HttpServiceInvoker = new HttpServiceInvoker(httpResult, httpError); 

           httpServiceInvoker.getWeather2(myInput.getText()); 

       } 

        

    } 

}

   

注:为降低复杂度,demo 中的 Java 服务端所有 Service 实现在此都不做叙述,我们已将服务部署到外网中,大家可通过aswing2java.zip 中的 code 来完成测试。  

  

 

flash.net简介 

  

AS3 中,有关于网络操作的类全部内置在 flash.net 中,理解这个 lib 将有利于我们更好的完成交互。

 

URLLoader :用于从网络或者本地读取文件,可以通过设置他的 dataFormat 属性改变收到的文本类型。默认值为 URLLoaderDataFormat.TEXT 纯文本格式。

URLLoader 部分事件。

complete :使用 URLLoader.load() 方法后,数据完全加载完毕时触发,说明程序加载完成。

ioError 使用 URLLoader.load() 方法时, 发生致命I/O错误时触发。

open 使用 URLLoader.load() 方法后,开始从服务器下载数据时触发。

progress :使用 URLLoader.load() 方法后,在从服务器下载数据的过程中持续触发, 通过侦听此事件我们可以很方便的做信息加载状态的显示。

securityError FlashPlayer 的安全异常, 比如跨域加载错误。

 

URLRequest 用于传递变量到服务器,以及 URLLoader load 的目标路径。 可以通过设置他的 contentType 属性改变发送到服务器的变量类型。

URLVariables :键/值对, user=zhuam&password=111

URLLoaderDataFormat :用于设置读取文件的类型,有 TEXT (纯文本), VARIABLES (/值对)BINARY (二进制格式)URLLoader 会根据类型不同来进行解码操作。

URLRequestMethod 设置用哪种方式来传递数据, POST 或者 GET

URLReqeustHeader URL HTTP 头部。

 

一、HTTPAS3 Remoting

 

由于 Flash 对跨域访问有严格的权限限制,故而获取其他站点的页面信息,我都是在服务端做了一层 Proxy。

package c2s 

{ 

    import flash.events.Event; 

    import flash.events.IOErrorEvent; 

    import flash.events.SecurityErrorEvent; 

    import flash.net.URLLoader; 

    import flash.net.URLLoaderDataFormat; 

    import flash.net.URLRequest; 

    import flash.net.URLRequestMethod; 

    import flash.net.URLVariables; 

    import flash.utils.ByteArray; 

     

    public class HttpServiceInvoker 

    {       

       protected var resultCallbackFunction : Function;             

        protected var errorCallbackFunction : Function;   

        

       // 请求地址 

       private const urlAddress : String = “http://gcc.cuscstar.com:8080/weatherHttpProxy.jsp”; 

        

       public function HttpServiceInvoker(resultCallback : Function, errorCallback : Function) 

       { 

           resultCallbackFunction = resultCallback; 

           errorCallbackFunction = errorCallback; 

           super(); 

       } 

        

       public function getWeather2(city: String): void { 

           // 建立 URLRequest 对象 设置 GET 方法调用 

           var request : URLRequest = new URLRequest(urlAddress); 

           request.method = URLRequestMethod.GET; 

            

           var cityVar : URLVariables = new URLVariables(); 

           cityVar.city = city;         

           request.data = cityVar; 

            

           // URLLoader DATA FORMAT 设置 BINARY 格式用于做Response字符集的转换 

           var loader : URLLoader = new URLLoader(); 

           loader.dataFormat = URLLoaderDataFormat.BINARY; 

            

           loader.addEventListener(Event.COMPLETE, resultCallback); 

           loader.addEventListener(IOErrorEvent.IO_ERROR, errorCallback); 

           loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorCallback); 

           loader.load(request); 

       } 

        

       private function resultCallback(event:Event):void {      

           /// 将接收的数据转换为 ByteArry ,通过 readMultiByte 来转换编码格式 

           var ba:ByteArray = ByteArray(URLLoader(event.target).data); 

        var rhtml:String = ba.readMultiByte(ba.length, “gb2312″); 

         

        resultCallbackFunction(rhtml); 

    } 

     

    private function errorCallback(event:Event):void { 

         

    } 

 

    } 

}

 

 

二、Hessian 

 

Hessian ( http://hessian.caucho.com/ria/ )Caucho公司制定的一个 RPC 协议,虽然它也是通过 HTTP协议传输 RPC 封包,但是它的 RPC 封包却是以二进制形式编码的,而且能够表现对象模型和异常体系,这使得 Hessian XML-RPC 更有效率。 

 

1、  首选需要我们去 http://hessian.caucho.com/#Flash/Flex 下载Hessian的最新Flash 版本 hessian-flash-3_1-snap.swc30k)。

 

2、  引用该 swc 到您的 AsWing 项目中,下面这段代码是通过AS3来调用 Java后台的一个Hessian气象信息服务,注:Java 部分的 Hessian 服务的开发与实现在此就不做叙述,有心之人皆可 Google ,讲解的文章很多。 

 

3、  AS3 通过 Hessian Java 交互 Code  ( 获取城市天气信息 ) 

 

package c2s 

{ 

 

    import flash.events.IOErrorEvent; 

     

    import hessian.client.HessianAsyncToken; 

    import hessian.client.HessianProxy; 

    import hessian.events.HessianErrorEvent; 

    import hessian.events.HessianResultEvent;  

     

    public class HessianServiceInvoker {  

        

       protected var resultCallbackFunction : Function;             

        protected var errorCallbackFunction : Function;   

        

       private var proxy:HessianProxy = new HessianProxy(“http://gcc.cuscstar.com:8080/hessian/service.do”); 

        

       public function HessianServiceInvoker(resultCallback:Function, errorCallback:Function) {     

            resultCallbackFunction = resultCallback;      

            errorCallbackFunction = errorCallback;     

            super();     

        }     

        

        public function resultCallback(data:Object):void {         

            resultCallbackFunction(data);     

        }     

         

        public function errorCallback(data:Object):void {         

        }  

 

       public function getWeather2(city: String):void 

       { 

         var token:HessianAsyncToken = proxy.getWeather2(city); 

         token.addEventListener(HessianErrorEvent.HESSIAN_ERROR, errorCallback); 

         token.addEventListener(HessianResultEvent.HESSIAN_RESULT, resultCallback); 

       } 

    } 

}

  

三、AMF3 ( Action Message Format )

 

Adobe就提出AMF(Action Message Format)技术,即将Java等语言的对象转换为ActionScript对象的技术规范。AMF是将数据对象高度压缩,编码后作为2进制来传输的,比起WebServiceHTTPServiceXML在效率上的确是有很大的提升。 

 

Adobe AMF协议及Java版本的AMF实现Blazeds也已经开放, 

http://labs.adobe.com/technologies/blazeds/ 

服务端Java AMF服务的实现,在此不做叙述,下面这两个部分的代码一个是用纯AS3完成服务的调用,另一个采用Flex3 Framework 来完成服务的调用。 

 

AS3 利用 Adobe AMF3 协议与 Java 交互 Pure AS3

 

package c2s 

{ 

    import flash.net.NetConnection; 

    import flash.net.ObjectEncoding; 

    import flash.net.Responder; 

     

    public class Amf3ServiceInvoker  

    {              

               

       private var nc : NetConnection = new NetConnection();    

       private var responder : Responder = null; 

       private const amf3URL : String = “http://gcc.cuscstar.com:8080/messagebroker/amf”; 

 

       public function Amf3ServiceInvoker(result : Function, error : Function) 

       {                     

           responder = new Responder(result, error);  

           super(); 

       } 

        

       public function getWeather2(city: String) : void{ 

           nc.objectEncoding = ObjectEncoding.AMF3;  

           nc.connect(amf3URL);      

           nc.call(“amf3ServiceInvoker.getWeather2″, responder, city); 

       } 

 

    } 

}

结束语

……

下载资源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值