今天就是想複習下上週自學的,好像有點忘記了.
一.關於AMF-RPC技術簡介:
AMF是專用於FLASH遠程數據傳輸的一種數據格式.
RPC是遠程過程調用,也是WEB分佈式服務的一種.網絡上找的解釋如下:
Remote Procedure Calls
遠程過程調用 (RPC) 是一種協議,程序可使用這種協議向網絡中的另一臺計算機上的程序請求服務。由於使用 RPC 的程序不必瞭解支持通信的網絡協議的情況,因此 RPC 提高了程序的互操作性。在 RPC 中,發出請求的程序是客戶程序,而提供服務的程序是服務器。RPC(遠程過程調用)是一項廣泛用於支持分佈式應用程序(不同組件分佈在不同計算機上的應用程序)的技術。RPC 的主要目的是爲組件提供一種相互通信的方式,使這些組件之間能夠相互發出請求並傳遞這些請求的結果。
那麼綜上:AMF-RPC就是使用amf數據格式實現的遠程方法調用了.在JAVA領域現在叫FLASH REMOTING MX FOR J2EE.主要優點是易用,高性能,和可擴展性.
下載地址:http://trials.adobe.com/pub/esd/trial/flashremoting-java-win-en.exe
FLASH 8相關組件flashremoting_components_flash8.rar下載地址:
http://kook1001.javaeye.com/topics/download/4635638e-8186-4439-a0cb-7594761d4529
雖然FLASH的最新版本是9.0(CS3)但是好像沒有更新這部分組件.具體也不太清楚,網絡上是這麼查的,所以暫時先用FLASH8.0
二.安裝和配置AMF-RPC開發環境
1.服務端組件:
直接點擊安裝flashremoting-java-win-en.exe就可以.主要是把安裝完生成的flashgateway.war拷出來,解壓後,把裏頭的flashgateway.jar拷到建的工程目錄下.
2.客戶端組件:
下下來的是flashremoting_components_flash8.msi文件,如果操作系統環境正確,也是直接安裝就可以,只要選擇一下FLASH的安裝路徑就好了.安裝完,打開FLASH,再點擊"組件"就可以看到了.
正所謂:工欲善其事,先利其器啊.終於搞定了環境了.
但是聽說,服務端在這個組件不是開源的要收費什麼的?也不太清楚,現在只能將就.
另外Java開源實現叫做OpenAMF.所以還有待更深入研究下.
網絡上的一些解釋:
Flash Remoting的原理類似於Resin的Hessian,都是使用基於HTTP協議的輕量級二進制協議,即AMF。
Flash Remoting使用AMF來和服務器通訊。基本過程的原理可以參考Flash網站上面的文檔。簡單來說就是在服務器端,需要有一個Gateway,這個Gateway就是一個Servlet,接收Flash的HTTP請求,然後把AMF格式封裝的HTTP請求解析成爲對服務器端對象的調用(例如調用Java的業務對象);在客戶端,Flash Remoting API接收服務器端的HTTP Response,把AMF格式封裝的Response解析成爲Flash 數據對象。
Flash6/Flash7都完整的支持Flash Remoting,特別值得一提的是,AMF會攜帶Session的Cookie id,所以你可以和瀏覽器編程一樣進行Session控制。
在服務器端,Macromedia提供Java版和dotnet版的Flash Remoting Gateway,但是要收費的(8000多人民幣),此外Macromedia的JRun和ColdFusion應用服務器也包含了Flash Remoting Gateway。
但是PHP和Java都有開源的Flash Remoting Gateway實現,Java叫做OpenAMF。這個OpenAMF實際上並不比MM的Flash Remoting Gateway差,並且由於開源,還有很多MM的Gateway不具備的功能。
三.應用程序例子:
是基於servlet的應用,是FLASH FOR JAVA 動態網站開發手札一書上的一個例子,先拿來用用.
1.web.xml文件的配置:
<servlet-name>FlashGatewayServlet</servlet-name>
<servlet-class>flashgateway.controller.GatewayServlet</servlet-class>
<init-param>
<param-name>LOG_LEVEL</param-name>
<param-value>Error</param-value>
</init-param>
<init-param>
<param-name>DISABLE_JAVA_ADAPTERS</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>FlashGatewayServlet</servlet-name>
<url-pattern>/gateway</url-pattern>
</servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<servlet-class>com.ll.amf.HelloWorldServlet</servlet-class>
</servlet>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
2.java代碼:
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
//導入所需的類庫
public class HelloWorldServlet implements Servlet {
//繼承Servlet類,最常使用的就是HttpServlet類
private String message = null;
public void init(ServletConfig config) throws ServletException {
message = "嗨!Flash Remoting MX for Java";
System.out.print("測試.........");
//調用Servlet的init()方法,在該方法內爲字符串message賦值
//要注意init()方法是在首次創建Servlet就調用的,
//而不是在每次請求是調用
}
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
request.setAttribute("FLASH.RESULT", message);
//每當服務器接收到對Servle的請求時,服務器就會產生一個線程
//並調用Servlet的service()方法,在該方法內
//我們使用request對象的setAttribute()方法爲參數FLASH.RESULT賦值
//參數FLASH.RESULT被返回給Flash影片應用程序
}
public String getServletInfo() {
return "A test servlet.";
}
public ServletConfig getServletConfig() {
return null;
}
public void destroy() {
message = null;
}
}
3.FLASH影片應用程序:就簡單創建一個空白的影片,加入代碼就OK了.哈
//-------------------------------------------------------------
import mx.remoting.Service;
//導入Service類
import mx.rpc.FaultEvent;
//導入FaultEvent類
import mx.remoting.PendingCall;
//導入PendingCall類
import mx.rpc.ResultEvent;
//導入ResultEvent類
import mx.rpc.RelayResponder;
//導入RelayResponder類
//import mx.remoting.debug.NetDebug;
//NetDebug.initialize();
//導入remoting.debug類並初始化
//或者兩行腳本併成一行,使用下面的腳本
mx.remoting.debug.NetDebug.initialize();
var myService:Service = new Service("http://localhost:8080/amftest/gateway", null, "amftest", null, null);
//連接到遠程服務
var pc:PendingCall = myService.HelloWorldServlet();
//調用遠程服務方法
pc.responder = new RelayResponder(this, "getData_Result", "getData_Fault");
//使用responder定義返回的結果對象或者出錯對象
trace("這時,信息還未返回");
function getData_Result(re:ResultEvent):Void {
//接收結果
trace(re.result);
}
function getData_Fault(fe:FaultEvent):Void {
//接收錯誤
trace("接收到錯誤");
}
測試影片結果如果在輸出面板出現在java代碼中定義的信息就OK啦.
好像也沒有那裏有很權威的資料,只是到處搜索到處拼湊哈,僅僅是學習用.見笑了.