今天就是想复习下上周自学的,好像有点忘记了.
一.关于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啦.
好像也没有那里有很权威的资料,只是到处搜索到处拼凑哈,仅仅是学习用.见笑了.