Flash Remoting的原理类似于--转

Flash与服务器端通信技术详解与实战 在互联网应用发展的早期阶段,Adobe Flash凭借其强大的多媒体处理能力和跨平台兼容性,广泛应用于网页动画、视频播放及富客户端交互系统中。其中,Flash与服务器端的通信能力是其实现动态数据交互的核心机制。本章将从整体架构出发,深入剖析Flash与后端服务进行数据交换的技术基础,涵盖通信模型的基本组成、网络协议支持(如HTTP、RTMP、XMLSocket)、以及客户端-服务器之间的请求响应模式。graph LRA[Flash客户端] -- HTTP/HTTPS --> B[Web服务器] 阅读详情

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不具备的功能。

采用Flash Remoting方式下的软件架构如下:

Flash(Client)  <-----(HTTP AMF)----> Spring Bean(Server) <-> Hibernate PO

由上面可以看到,传统的Web层完全被砍掉了,Flash通过AMF协议和Gateway的转换,可以直接访问服务器端的Spring Bean。

这样服务器端编程仅仅是Spring Bean的业务层和Hibernate处理的持久层。所有的脏活累活都推到了客户端,由Flash Actionscript来搞定。而在客户端编程就非常类

似传统的VB/Delphi,完全事件响应机制。下面是一个Hello World的例子:
服务器端编程照旧,我们可以写一个Hello World的例子如下:

Java代码
public class HelloWorld {  
    public String getString(); {  
        return "Hello World!";  
    }  
} 

public class HelloWorld {
    public String getString(); {
        return "Hello World!";
    }
}

applicationContext.xml配置如下:

Xml代码
<bean id="hello" class="com.javaeye.HelloWorld"/> 

<bean id="hello" class="com.javaeye.HelloWorld"/>

然后就是客户端的as的工作了:

在Flash里面拖出来一个按钮组件,命名为clickButton,再拖出来一个文本组件,命名为helloText(用来显示从服务器端取得的调用结果)

切记:开发Flash Remoting,你必须另外到MM网站下载Flash Remoting ActionScript2.0 for Flash MX 2004安装,否则没有办法编译Remoting的程序。然后在Flash

里面打开“公用面板”(在窗口|其他面板|公用库|Remoting),把库里面的RemotingClass和RemotingDebugClass拖到舞台上,然后再删除掉。

为了清晰的分离Flash,美工工作和AS程序员工作,在时间轴上面新建一个图层,命名为“actionscript”(或者随便什么名字),在动作框里面写入:

#include "hello.as"

保存。至此,Flash美工部分完成。

然后使用Editor(推荐使用SEPY,不要那么骚包的去用Eclipse)新建一个hello.as(和flash源文件在同一目录下面),编写下面的代码:

Java代码
import mx.remoting.Service;  
import mx.rpc.RelayResponder;  
import mx.remoting.PendingCall;  
import mx.rpc.ResultEvent;  
import mx.rpc.FaultEvent;  
import mx.services.Log;  
 
 
function getString_Result(evt:ResultEvent):Void {  
    helloText = evt.result;  
}  
 
function getString_Fault(evt:FaultEvent):Void {  
    trace("Error: "+evt.fault.__faultstring);  
}  
 
saveButton.clickHandler = function() {  
    var gatewayPath = "http://localhost:8080/openamf/gateway";  
    var service:Service = new Service(gatewayPath, new Log(), "hello", null,null);  
    var mypc:PendingCall = service.getString();  
    mypc.responder = new RelayResponder(this, "getString_Result", "getString_Fault");  
} 

import mx.remoting.Service;
import mx.rpc.RelayResponder;
import mx.remoting.PendingCall;
import mx.rpc.ResultEvent;
import mx.rpc.FaultEvent;
import mx.services.Log;


function getString_Result(evt:ResultEvent):Void {
 helloText = evt.result;
}

function getString_Fault(evt:FaultEvent):Void {
 trace("Error: "+evt.fault.__faultstring);
}

saveButton.clickHandler = function() {
 var gatewayPath = "http://localhost:8080/openamf/gateway";
 var service:Service = new Service(gatewayPath, new Log(), "hello", null,null);
 var mypc:PendingCall = service.getString();
 mypc.responder = new RelayResponder(this, "getString_Result", "getString_Fault");
}

saveButton的clickHandler是处理按钮的点击事件的,可以仔细看一下Flash是如何调用服务器端的Spring的bean的:

先要new一个Server对象,其中需要传两个参数,一个是服务器的gateway的地址,另一个是bean的id。然后new出来的service对象实际上就是Flash客户端生成的一个

服务器端hello这个Spring Bean的本地代理类,接下去,就可以直接调用该代理类的getString方法了(触发远程方法调用),然后要注册两个接收函数来分别处理结

果。一个是正常返回,那么让helloText显示为调用结果字符串,即“Hello World!”,另一个是错误返回,打印错误信息(实际软件产品,可以给出更加人性化的处

理方式)。

最后是要配置一下OpenAMF,openamf对于我们项目的侵入性是很低的,它本质上就是一个servlet而已。把openamf的jar和依赖jar都放到WEB-INF/lib下面,然后配置

一下web.xml,加入Gateway,整个web.xml样子如下:

Xml代码
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 
<web-app> 
      
    <context-param> 
        <param-name>contextConfigLocation</param-name> 
        <param-value>classpath:applicationContext.xml</param-value> 
    </context-param> 
      
    <listener> 
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 
      
    <servlet> 
        <servlet-name>DefaultGateway</servlet-name> 
        <display-name>DefaultGateway</display-name> 
        <description>DefaultGateway</description> 
        <servlet-class>org.openamf.DefaultGateway</servlet-class> 
        <init-param> 
            <param-name>OPENAMF_CONFIG</param-name> 
            <param-value>/WEB-INF/openamf-config.xml</param-value> 
            <description>Location of the OpenAMF config file.</description> 
        </init-param> 
        <load-on-startup>1</load-on-startup> 
    </servlet> 
      
    <servlet-mapping> 
        <servlet-name>DefaultGateway</servlet-name> 
        <url-pattern>/gateway</url-pattern> 
    </servlet-mapping> 
    
    <session-config> 
        <session-timeout>30</session-timeout> 
    </session-config> 
      
    <welcome-file-list> 
        <welcome-file>index.html</welcome-file> 
    </welcome-file-list> 
      
</web-app> 

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
 
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>
 
 <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 </listener>
 
 <servlet>
  <servlet-name>DefaultGateway</servlet-name>
  <display-name>DefaultGateway</display-name>
  <description>DefaultGateway</description>
  <servlet-class>org.openamf.DefaultGateway</servlet-class>
  <init-param>
   <param-name>OPENAMF_CONFIG</param-name>
   <param-value>/WEB-INF/openamf-config.xml</param-value>
   <description>Location of the OpenAMF config file.</description>
  </init-param>
  <load-on-startup>1</load-on-startup>
 </servlet>
 
 <servlet-mapping>
  <servlet-name>DefaultGateway</servlet-name>
  <url-pattern>/gateway</url-pattern>
 </servlet-mapping>
 
 <session-config>
  <session-timeout>30</session-timeout>
 </session-config>
 
 <welcome-file-list>
  <welcome-file>index.html</welcome-file>
 </welcome-file-list>
 
</web-app>

此外openamf还有一个自己的配置文件openamf-config.xml,这里我们因为需要访问Spring Bean,因此可以如下配置:


Xml代码
<?xml version="1.0" encoding="UTF-8"?> 
<config> 
    <amf-serializer> 
            <force-lower-case-keys>true</force-lower-case-keys> 
    </amf-serializer> 
 
    <invoker> 
        <name>Spring</name> 
        <class>org.openamf.invoker.SpringBeanInvoker</class> 
    </invoker> 
</config> 

<?xml version="1.0" encoding="UTF-8"?>
<config>
 <amf-serializer>
   <force-lower-case-keys>true</force-lower-case-keys>
 </amf-serializer>

 <invoker>
  <name>Spring</name>
  <class>org.openamf.invoker.SpringBeanInvoker</class>
 </invoker>
</config>
这种架构使得Flash RIA完全成为可能。具备如下一些优点:

1、服务器端编程工作量减轻了一半以上

传统的服务器端Web编程工作量比例非常大,要写很多很多的Action代码,和JSP  Tag代码。这种方式根本就不需要Web层了。

当然带来的另一个问题就是权限的控制,我们不能让别人任意通过gateway访问到我们的业务对象,因此可以通过给Spring Bean增加一个interceptor来进行Session和权限控制,由于Flash也支持Session范围的Cookie,所以我们完全可以按照传统的方式来编写interceptor。

此外OpenAMF的AdvancedGateway提供了更多高级的控制方法,基于Session的控制,基于应用服务器角色的控制,以及可以通过配置文件控制某个业务对象的某个方法的访问权限等等。

2、Flash美工和AS程序员良好的分离

两者之间仅仅需要进行组件名称的约定即可,美工使用Flash MX 2004来构建界面,而AS程序员使用SPEY或者其他AS Editor来编写Actionscript,最后放在一起编译即可。这一点,Flash美工现在非常欢迎。

缺点:

1、AS的工作量很大

采用新技术不能消灭问题,只能把问题转化为另一种形式,所以dirty的东西现在都由as来完成,特别是这种方式下你需要手工写as来进行数据的绑定,因此工作量还是非常大,非常烦琐的。 

前些天在看国外一些BLOG对GMail架构的分析. 发现GMail也是把复杂的UI部分(包括数据填充)都扔给了JavaScript. Server返回构建DataPack的JavaScript, 浏览器执行这段代码后再调用UI Builder, 根据DataPack来修改HTML DOM.

各个架构换来换去都会有比较繁琐和累赘一块, JSP, Java Source, JavaScript or AS. 

Zephyr RTOS详解 Zephyr 是一个开源的实时操作系统(RTOS),专为资源受限的嵌入式设备设计,支持多种架构(如 ARM Cortex-M、RISC-V、x86 等)。 阅读详情

相关推荐

ETL第八章无人售货机零售项目实践

ETL实战项目——无人售货机

m0_52058217的博客 4418

Flash Remoting概述

哈哈,轉載該篇文章主要用來自己睇傑,無他意,來源:http://www.riafan.com/default.asp什么是Flash Remoting?它是一种是语言吗?不是,它实质上是一种与已有应用服务器整合的服务器端技术。Flash Remoting为Flash 播放器与部署在服务器端的远程服务间的通信提供通路,让我们方便快速地创建RIAs(Rich Internet Applicatio

Baijinwen的专栏 1190

Keil5安装包别乱下!手把手教你从官网精准下载C51/V960和MDK5,并完成2032年有效注册(避坑网络资源失效)

本文详细介绍了如何从Keil官网安全下载C51 V9.60和MDK5开发环境,并提供2032年有效注册的完整指南。通过验证安装包完整性、自定义安装路径和长期激活方案,帮助开发者避开网络资源陷阱,搭建稳定的STM32开发环境。

weixin_26886855的博客 532

Linux 指令心法(十五)`flash_eraseall` 擦除整个Flash存储器

当需要销毁或清除闪存设备中的敏感数据时,可以使用flash_eraseall命令来擦除整个分区的数据,并进行坏块检测,以确保数据不被恢复。使用flash_eraseall命令,指定待擦除的分区设备,例如/dev/mtd0,即可擦除整个分区的数据,并进行坏块检测。使用flash_eraseall命令,指定待擦除的分区设备,例如/dev/mtd0,即可擦除该分区的所有数据。在开发或调试过程中,可能需要清除闪存设备中的特定分区数据,以便重新写入新的数据或固件。

weixin_43564241的博客 2986

Labview 机器视觉(4)之 图像处理进阶 - 动态ROI与批量保存

本文深入探讨了LabVIEW机器视觉中动态ROI与批量保存两大进阶技术。动态ROI通过模式匹配或粒子分析实现检测区域的自动追踪,解决了产品位置变化带来的挑战。同时,文章详细介绍了如何设计高效的文件命名规则与异步保存机制,以实现海量图像数据的批量保存与管理,从而构建稳定、高效的工业自动化检测系统。

weixin_29234423的博客 219

线性代数学习笔记(十)——矩阵运算(二)

本篇笔记讲解矩阵的幂运算和矩阵的转置,其中矩阵进行幂运算的前提是矩阵为方阵,矩阵幂运算的两条性质与数的幂运算规则类似;矩阵转置的定义与行列式转置类似,但要注意由于矩阵的行数和列数不同,所以转置之后行数和列数变换。

li2008kui的专栏 1万+

你需要Flash Remoting嗎?

Flash MX推出後,Macromedia積極推出很多和Flash有關的產,有DRK、Flash Remoting、FlashCom、Data Connecton Kit,即將來臨還有Central和Royale……其中最令一般Flash玩家疑惑的是Flash Remoting和Data Connecton Kit,究竟他們有什麼用?兩者有什麼分別?我只用過Flash Remoting,DCK和

Tomy(-k-)'s Blog 1184

Proxmox VE网络配置踩坑实录:从Web界面无法访问到完美修复的全过程

本文详细记录了Proxmox VE服务器Web界面无法访问的完整排查与修复过程。作者从基础网络连通性测试入手,逐步排查了服务状态、SSL证书、端口监听、防火墙规则及网关配置,最终定位并解决了问题。文章提供了系统性的故障排查思路和实用的修复命令,对管理Proxmox VE网络具有重要参考价值。

weixin_29231221的博客 889

flash java 通信_FLASH与服务器通讯 (JAVA)

1.FLASH 通过URL地址获得服务器数据。这种方式最为简单,就像在浏览器的地址栏里面敲一样。先建立一个URLRequest,然后用URLLoader载入就行了。下面这个是载入一个图片,html页面也用同样方法载入。public function Net(){var loader:URLLoader;var request:URLRequest = new URLRequest("http://...

weixin_33167456的博客 414

02-Cesium-实现天地图标记

首先天地图申请token,然后Cesium-实现天地图标记详细说明

m0_62785037的博客 1171

华为OD机试真题2025双机位C卷 Python&JS 实现【卡牌游戏】

小明正在尝试一种新的牌游戏。游戏规则只如下:首先,小明拿到一张写有数字m的牌。 然后,他会拿到另外n张牌,上面分别写有不同的数字,牌排成一排。小明的目标是从这排牌中找到一串连续的牌,这些牌上数字的总和可以被 m整除。你的任务是判断小明是否可以完成这个目标。

MISAYAONE的博客 403

servlet 使用AMF3和flash通讯

 经过多次研究,终于实现了JAVA servlet 用AMF3协议基于http到as3的数据传输。 因为JSP输出文本,而AMF3协议是二进制流,所以JSP是做不出来的. servlet中可以实现,servlet功能也能够满足服务器构架需求,甚至用servlet更好.   ------------------------------java servlet代码------------

刘欣的优快云博客 932

【2005】人工智能⭐

问题的解答来自于过去的经验而不是规则,这些经验是以案例方式存储的。但是当人们遇到一个新的问题的时候,一般先是回忆,从记忆中找到一个与新的问题相似的案例,然后把该案例的有关信息和知识复用到新问题的求解之中。1、若案例(case)不够充足,而有足够的规则(知识),试问如何构建一个包含有基于案例推理和基于规则推理的推理系统,以使推理效率提高而且总能求得问题的解。一般认为,CBR适合缺乏完备和健全的理论,但又可获取丰富经验的领域,而RBR则适合于对领域有充分的认识,能以完备和健全的形式表示领域理论的场合。

super_mochi1 280

flash中的Remoting

[code="java"]package { import flash.net.Responder; import flash.net.NetConnection; public class Remoting extends NetConnection { /* 构造 @param gatewayURL remoting网关地址 @param amfType...

wk_ghost的博客 161

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

调试flash remoting的两个工具

在这里找到的 http://www.flashxm.com/?p=74 下面是下载地址: http://www.xk72.com/charles/download_action.php?os=windows   另外一篇关于flash  remoting 原理的介绍 http://www.blogjava.net/liuwentao253/archive/2006/07/27/60298.html...

成长全记录 144

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

实例:Flash Remoting的Hello World!

 Flash Remoting的原理类似于Resin的Hessian,都是使用基于HTTP协议的轻量级二进制协议,即AMF。 Flash Remoting使用AMF来和服务器通讯。基本过程的原理可以参考Flash网站上面的文档。简单来说就是在服务器端,需要有一个Gateway,这个Gateway就是一个Servlet,接收Flash的HTTP请求,然后把AMF格式封装的HTTP请求解析成为对服务器

1248

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Flash remoting

<br />概述 <br />  Flash remoting是一种连接flash client 与 server端的技术,它的功用就像是 web service, xml, loadVars一般,可以在两者之间交换资料,达到动态置换内容的目地。 <br />  它可以轻松访问业务逻辑层和Web Services, 轻松测试和调试,简化数据集处理,全面支持XML使用,支持RIA表现层,封装数据可保密,部署简易且可跨平台跨设备。 <br />  原理 <br />  Flash remoting特别的地方在于

zhangxinrun的专栏 984

Flash Remoting网关

哈哈,轉載該篇文章主要用來自己睇傑,無他意,來源:http://www.riafan.com/default.aspFlash 播放器使用AMF(Action Message Format),通过HTTP网络协议将客户端的请求发送Flash Remoting网关。因为应用服务器平台的不同, Flash Remoting在服务器端包含一系列不同的过滤器(filter)。当Flash Remoti

Baijinwen的专栏 1310

Flash Remoting——全新的网络应用开发模式

Flash Remoting ----全新的网络应用开发模式   Flash Remoting 的开发模式  自从三年前我开始从事 Java 网站后台开发工作以来,我一直都在寻找一种比较好的开发模式。纵观现在众多的网站开发方式,虽然开发语言各不相同,但是形式没什么太大的变化。  无论你采用 Perl,PHP,ASP,JSP,实际的过程大致是这样的。   1:用户到你的站点,输入信息,点击“...

weixin_30587025的博客 130

Flash与后台数据交互方法总结

摘引自:http://www.klstudio.com/ P.S  最近有一些网友总是询问flash与后台数据交互的问题,因此我就做了一些总结和整理,也想方便大家了!  目前据我所知,Flash与后台数据交互共有下列几种方法(如果你觉得不全,你可告知一下,我会添加上去了): 1.LoadVars(XML) 2.Flash Remoting 3.Webservice 4.XML

terry_zeng的专栏 2543

通过nginx负载marcomedia AMF flash remoting RIA客户端

  通常我们使用nginx来做http的负载,今天我通过试验发现,nginx默认是支持AMF协议的.不得不赞一个!  通常我们在flash客户端中负载的话是修改remoting service的gateway地址,比如有2个服务,部署于game1.xxx.com 和 game2.xxx.com 那么flash中AS的网关调用写法就是调用 http://game1.xxx.com/gateway.aspx 或者 http://game2.xxx.com/gateway.aspx  这样做,负载就很麻烦,域名改

akulakk's memory stack 1528

flex 3 + .net开发flash Remoting三 --- Flex编程

flex 3 + .net开发flash Remoting三 --- Flex编程一. 相关说明。    1. 声明。    在研究flash Remoting的时候,参考了很多相关方面的资料,其中包括博客园里很多网友的大作(比较全面的有“幸福★星”的 Flex与Asp.Net通过Remoting 方式进行通讯 系列文章),如在本篇中有雷同或类似的代码,请大家多多包涵。    2. 永远的Hell

xy2002_cat的专栏 526

flash与后台的交互

一.LoadVars篇我之所以把XML也放在这里说,是因为XML和LoadVars数据交互的方式大体相同,就是传递时的数据内容有点不一样而已! 我现在列出在开发过程最常用的"用户密码验证"实例,加以说明!//=====================================================; // Flash代码; //===========================...

weixin_30822451的博客 142
上一篇: ResultSet获取行数
下一篇: java socket编程收藏之四(线程池)
hacktt
博客等级 码龄19年 21粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值