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 閱讀(683) 評論(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
          主站蜘蛛池模板: 平顺县| 平罗县| 永定县| 德兴市| 罗城| 盐池县| 轮台县| 资源县| 梅州市| 绥滨县| 威宁| 舟山市| 尼勒克县| 太原市| 玉屏| 河西区| 呼玛县| 龙南县| 仁寿县| 大邑县| 漾濞| 南投县| 南宫市| 灵石县| 富阳市| 兰西县| 靖边县| 通渭县| 田东县| 定西市| 屏山县| 兰西县| 毕节市| 寿光市| 塔河县| 祁门县| 从化市| 轮台县| 江山市| 张家港市| 类乌齐县|