AsWing 與 Java 之間的交互
Web2.0 成就了AJAX,也促進了新技術在 RIA 行業的不斷演進,這之后出現的Adobe Flex 、AIR 與Microsoft 的 SilverLight尤為突出,至于這兩種技術之間的優劣在此不做比較。
作為實用主義者,在我看來能更快速、更好地幫助客戶解決問題的技術,那就是好的技術。07年2月的一個時間萌生了重新架構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 頭部。
一、HTTP(AS3 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.swc(30k)。
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進制來傳輸的,比起WebService、HTTPService、XML在效率上的確是有很大的提升。
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);
}
}
}
結束語
……
下載資源
- AsWing http://www.aswing.org/
- Hessian http://hessian.caucho.com/
- Blazeds http://labs.adobe.com/technologies/blazeds/
- AsWing2Java http://gcc.cuscstar.com:8080/aswing2java.rar
- Hessian Flash-only (不需要Flex框架支持):
posted on 2008-08-11 18:35 gembin 閱讀(683) 評論(0) 編輯 收藏 所屬分類: ActionScript3