AMF-RPC for java 基礎入門

今天就是想複習下上週自學的,好像有點忘記了.

一.關於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,再點擊"組件"就可以看到了.

RemotingConnector組件

 

正所謂:工欲善其事,先利其器啊.終於搞定了環境了.

但是聽說,服務端在這個組件不是開源的要收費什麼的?也不太清楚,現在只能將就.

另外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>
        
<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>
    <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代碼:

 

package com.ll.amf;

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了.哈

 

stop();
//-------------------------------------------------------------
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"nullnull);
//連接到遠程服務
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啦.

輸出結果

 

好像也沒有那裏有很權威的資料,只是到處搜索到處拼湊哈,僅僅是學習用.見笑了.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章