gembin

OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

HBase, Hadoop, ZooKeeper, Cassandra

Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

About Me

 

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); 

       } 

 

    } 

}

结束语

……

下载资源

posted on 2008-08-11 18:35 gembin 阅读(619) 评论(0)  编辑  收藏 所属分类: ActionScript3


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(6)

随笔分类(440)

随笔档案(378)

文章档案(6)

新闻档案(1)

相册

收藏夹(9)

Adobe

Android

AS3

Blog-Links

Build

Design Pattern

Eclipse

Favorite Links

Flickr

Game Dev

HBase

Identity Management

IT resources

JEE

Language

OpenID

OSGi

SOA

Version Control

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

free counters