Flash Player有点像vs开发asp.net的内置的IIS,AIR(Adobe Integrated Runtime)则像.net的运行时Runtime。AS1、AS2、AS各种版本语法相差太多,它们之间除了名字有点联系外,几乎没有任何关系,而如.net有C#和VB一样,共用的是.net framework这个框架,他们共用AIR。

浏览器接收和发送数据,我们可以用get/post方式提交数据,然后我们可以使用request对象对应的queryString属性或Form属性在提交到的页面获取提交的信息。注意中文字符用UTF-8去编码。

同样的,asp.net网页与falsh的交互也可以使用get/post的方式,对于复杂的数据类型可以使用get方式构造一个xml格式的文本字符串返回给Flash。

跳过http的请求与相应等相关知识,发现用navigateToURL函数可以使用“javascript:”伪协议调用网页中的javascript函数。但是这种方法由于种种限制或弊端,一般不会用,而选择用externalinterface的call方法。

externalinterface详情,可以去官网查看:http://livedocs.adobe.com/flash/9.0_cn/main/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00001653.html

关于js与as互相如何调用,我做了一个例子,经过测试是可以的。

--关于远程方法调用的问题

使用FluorineFx开源的AMF-RPC。注:RPC——进程间通信

Remoting技术:

1.Remoting Channel:这是指客户端和服务端的通讯协议,如TCP、HTTP协议。

2.Serializer:这是指在传输时采用何种格式来传输数据,如可以采用Binary,也可以采用SOAP来传输XML格式的数据。

客户端的数据经过序列化,通过HTTP被传递到远程服务端。在服务端,一般会有一个代理(网管)接收并将数据逆序列化,从而执行位于服务端的方法并返回给客户端。

AMF-RPC是目前最重要的Flash Remoting技术,传输时的数据格式是Action Message Format(简称AMF),目前有连个版本AMF0和AMF3,AMF3是AMF0的增强版本。

简单的HTTP功能,我们可以用URLLoader,但是如果涉及到复杂的问题的时候,就麻烦了。所以,AMF-RPC的优点就体现在复杂的操作上。

比如:

易用:AMF-RPC可以对本地远程服务程序代码(Java、C#、PHP)的数据类型进行自动转换,既可以转换成Actionscript代码数据类型,也可以转回本地远程服务程序代码数据类型。

    高性能:AMF-RPC使用Action Message Format(AMF)将Flash影片应用程序和远程服务之间的通信信息序列化。AMF是一个二进制格式,通信更加快速。

可扩展性:AMF-RPC设计集成了现有应用程序设计模式和最佳的开发实践,从而可以满足高度扩展性Flash网络应用程序设计要求。

下载安装FluorineFX

创建一个asp.net的一个应用程序

将web.config文件添加几行代码,他将对该应用程序的请求都映射到FluorineFx.FluorineGateway这个HttpModule来处理。

<?xml version="1.0"?>
<configuration>
<system.web>
<compilation defaultLanguage="C#" debug="true" targetFramework="4.0">
</compilation>
<httpModules>
<add name="FluorineGateway" type="FluorineFx.FluorineGateway,FluorineFx"/>
</httpModules>
<globalization requestEncoding="utf-8" responseEncoding="utf-8"/>
<pages controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/></system.web>
</configuration>

引用FluorineFx.dll

创建一个类

using FluorineFx;//引用FluorineFX
using System;namespace org.zhangyafei {[RemotingService()] //标明这个远程服务public class HelloWorld {public string sayHelloWorld(String arg) {return "嗨!AMF-RPC for .NET" + arg;}}
}

上面这个类里面写了一个带参数的方法,并返回一个string。

以下是flash源文件的代码

// [01]======================================================

// 创建一个NetConnection实例并连接到网关
var nc:NetConnection = new NetConnection();
// 注册各种事件监听函数(可选)
nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncErrorHandler);
nc.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
nc.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityErrorHandler);
function asyncErrorHandler(evt:AsyncErrorEvent):void
{
trace(evt);
}
function ioErrorHandler(evt:IOErrorEvent):void
{
trace(evt);
}
function netStatusHandler(evt:NetStatusEvent):void
{
trace(evt);
}
function securityErrorHandler(evt:SecurityErrorEvent):void
{
trace(evt);
}
// 设置默认编码
NetConnection.defaultObjectEncoding = ObjectEncoding.AMF3;
nc.connect('http://localhost/zhangyadong2/gateway.aspx');
//gateway.aspx作为一个远程服务的网管,此名称必须为此。gateway.html都不行。
//通过反编汇工具发现FluorineFx.dll里面有个private class FluorineGateWay。


// [02]======================================================

// 定义响应及回调函数,这是异步调用的通用步骤
var responder:Responder = new Responder(onResult,onError);
// 回调函数用于处理结果和错误
function onResult(re:Object):void
{
trace(re);
}
function onError(err:Error)):void
{
trace(err);
}


// [03]======================================================

// 调用远程方法,并设置回调函数
nc.call("org.zhangyafei.HelloWorld.SayHelloWorld", responder,",可以执行中文的");
//输出结果:"嗨!AMF-RPC for .NET可以执行中文的"

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

//第一个是完全限定的类名,即命名空间下的HelloWorld类SayHelloWorld方法,最后一个参数“可以执行中文的”这个是参数

//注意了,WebApplication有命名空间,而WebSite没有命名空间,WebApplication的类文件直接会被放在应用程序目录下。而WebSite的类文件则会放置在App_Code文件夹内,虽然放在了一个文件夹里,但是仍然是”根.类名.方法“的访问。

//WebSite必须放在App_Code文件夹里

Flash代码运行分为3个步骤

1.使用Netconnection对象链接到远程服务网关,这个通过connect方法实现,在此之前应该使用defaultObjectEncoding属性或objectEncoding属性设置编码格式。注意,defaultObjectEncoding属性是静态成员。

2.使用Responder对象定义一个响应,该响应用来指定回调函数用于处理返回的结果和错误。

3.使用call方法调用远程服务方法,并将响应与某个Responder对象建立关联,从而当响应返回时就交由该对象进行处理。注意call方法指定的远程服务及其方法参数。远程服务名是完全限定的类名,完全限定意为着包含命名空间。

此外,有个安全沙箱的问题。

crossdomain.xml文件要放在根目录下,用来设置flash与web交互的权限

  <?xml version="1.0"?><!DOCTYPE cross-domain-policy (View Source for full doctype...)>
-<cross-domain-policy><site-control permitted-cross-domain-policies="all" /><allow-access-from domain="*" secure="true" /><allow-http-request-headers-from domain="*" headers="*" secure="true" /></cross-domain-policy>

另外,还要注意,在flash发布的时候,要把设置访问为”网络“,而不是”访问本地“

调用远程服务

WebService类

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.Services;
using FluorineFx;/// <summary>
///WebService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
[RemotingService()]
public class WebService : System.Web.Services.WebService {public WebService () {//如果使用设计的组件,请取消注释以下行 //InitializeComponent(); }[WebMethod]public string HelloWorld(string parm) {return "Hello World"+parm;}}

flash源代码

import flash.net.NetConnection;
import flash.net.Responder;var nc:NetConnection=new NetConnection();NetConnection.defaultObjectEncoding = ObjectEncoding.AMF3;
nc.connect('http://localhost/zhangyadong2/gateway.aspx');var responder:Responder = new Responder(onResult,onError);function onResult(re:Object):void
{
trace(re);
}function onError(err:Object):void
{
for (var i:String in err)
{
trace(err[i]);
}
}nc.call("WebService.HelloWorld",responder,"nihao");
//WebService是服务名称,即类名名称,不需要加asmx。

输出:”Hello Worldnihao“


传递参数的数据类型

public Array sayHelloWorld(String arg)
        {
            string[] d = new string[2] { "df", "dsf" };
           return d;
        }

当在应用程序这边写了一个返回数组的方法的时候,ActionScript是这样调用的:

// 回调函数用于处理结果和错误
function onResult(re:Object):void
{
qq.text=("用户名:"+re[0].toString()+"密码:"+re[1].toString());
}

在测试falsh的时候,用上trace()进行弹出,方便排错。

AMF-RPC的工作原理:

在服务端,AMF-RPC是作为一ASP.NET网络应用程序的一个前端组件,他处理从ActionScript到.NET应用程序服务器的数据类型转换。准确的说,AMF-RPC是一个代理网关,客户端的Flash应用程序对服务端ASP.NET网络应用程序的请求都必须经过该代理网关进行处理。

在网关收到服务请求之前,该请求必须先通过过滤装置处理串行数据,日志和安全检验,最后到达一个服务适配器,服务适配器被用来处理服务和启动类型。

FluorineFX的服务适配器就是“.NET类适配器”。

分析:

当运行于Flash Player中的Flash影片应用程序(或Flex应用程序)发出调用请求后,Flash Player首先将调用的消息序列化为AMF格式,然后通过HTTP请求发送给服务器。位于服务器的网关(http://localhost/fluorine/gateway.aspx)对AMF格式的消息进行逆序列化,获取远程服务调用信息,并执行对远程服务中方法的调用。接着,网关将执行结果序列化为AMF格式,并将其返回给客户端的Flash Player,Flash Player逆序列化这一响应数据,并交与Flex应用程序或Falsh影片应用程序。一般用于处理响应的都是一个“回调函数”。

AMF(Action Message Format)是一种二进制的信息编码格式。

AMF符合Simple Object Access Protocol(SOAP)协议格式,它使用信息包格式分段传送信息。

一个AMF信息包包含以下5个部分。

1.信息包头,这一部分包含了AMF版本信息。

2.上下文环境关系头计数。

3.上下文环境关系头配置。上下文环境关系头包含了一个一个独立的AMF信息应当怎样被处理的描述信息。

4.信息计数。

5.信息配置。

在客户端,服务端方法请求被使用NetConnection类的方法自动序列化为AMF格式;在服务端,AMF-RPC逆序列化AMF信息。

一次交互的过程,经过两次个格式转换。

张亚飞《.Net for Flash FMS》读后笔记一相关推荐

  1. Flash+fms视频录制在项目中的实际应用

    Flash+fms视频录制在项目中的实际应用 前言:以下只是记录本人在项目中的应用,而flash+fms视频录制有多种实现方式,具体可根据实际情况而定! 1:古人云:工欲善其事,必先利其器,首先安装f ...

  2. 张亚飞《.Net for Flash FMS》读后笔记二

    VO(Value Object,值对象) 它是一些特定对象的统称,这些对象主要是由它们的属性的值来定义,通常不包含有任何业务方法.并且它们经常是不可变的,这意味着一旦它们被创建,就不能再更新了. 用途 ...

  3. 看张亚飞《.Net for Flash FMS》的笔记

    Flash Player有点像vs开发asp.net的内置的IIS,AIR(Adobe Integrated Runtime)则像.net的运行时Runtime.AS1.AS2.AS各种版本语法相差太 ...

  4. 【张亚飞】 Adobe Flash Player和Flash Player 检测工具包

    对于Flash动画创作和Flash开发,有两样东西是你必备的,而且必须拥有,那就是: [1]Adobe Flash Player(Adobe Flash播放器,以前被称为Macromedia Flas ...

  5. flash FMS的一些最优参数设置

    原文地址 对任何使用影音串流的 FlashCom 程式来说,影音串流的品质是极重要的,但调校相关参数却需要非常好的技巧及多次测试,无意间逛到国外有人已写好一个计算建议值的小程式,应该对参数的决定有很大 ...

  6. 丢弃RTMP协议的FLASH视频直播方案所踩过的坑

    http://blog.csdn.net/yuanrxdu/article/details/23593035 很久没有写博客了,最近一直在忙FLASH直播相关的事情,终于完成了阶段性工作.先描述下我们 ...

  7. Android IOS WebRTC 音视频开发总结(三三)-- Periscope介绍

    本文主要介绍Periscope,文章来自博客园RTC.Blacker,支持原创,转载请说明出处. 可能国内很多人没听说过Periscope,这可是现在Twitter上很火的一个APP,先看看人家自己是 ...

  8. 345本关于java的pdf电子书 [索引]

    所有PDF人肉检测真实可看,都不需要一一购买,一口价9.9合适就下, 统一解压密码: 密码汇总下载链接: https://pan.baidu.com/s/1NFNSYf3Q7VOl45xhIqDtkA ...

  9. Flash/Flex学习笔记(53):利用FMS快速创建一个文本聊天室

    先来看客户端fla的构成: 第一帧:登录界面 第一帧的代码: show sourceview source print? 01 import flash.events.MouseEvent; 02 i ...

最新文章

  1. 文本特征选择 java代码_文本分类入门(十)特征选择算法之开方检验
  2. Java设计模式(二十一):备忘录设计模式
  3. Unity3d 控制物体移动、旋转、缩放
  4. ubuntu快捷键收集
  5. 4后期盒子叫什么_Carlife转Carplay盒子科普
  6. 一个法国摄影师在中国
  7. javascript获取事件源对象和产生事件的对象
  8. C语言基础知识之基本数据类型相关的总结
  9. PPDet:减少Anchor-free目标检测中的标签噪声,小目标检测提升明显
  10. mysql 配置多个数据库连接_SpringBoot多数据库连接(mysql+oracle)
  11. react 源码概览
  12. Windows Mobile 5.0新增API介绍(转自MSDN)
  13. VMware15.5.2安装unlocker时下载工具一直失败
  14. 边做边记中航信酒店接口开发
  15. 利用BioEdit软件进行短序列序列比对之查看突变位点
  16. PHP制作简单图床,利用微博当图床-php语言实现
  17. 目标检测, 实例分割, 图像分类, panoptic segmentation文献
  18. 谷歌关键词是怎么排名的?google关键词优化
  19. HQL和Criteria
  20. 微信小程序支付流程!

热门文章

  1. Tita 绩效管理:低质量周会的7个表现
  2. u-boot启动流程简图 --木草山人
  3. 从陶潜的“化”到王维的“空”
  4. Bean Definition到底是什么,附spring思维导图分享
  5. 【杂谈】万字长文回顾深度学习的崛起背景,近10年在各行各业中的典型应用
  6. 需求分析挑战之旅(疯狂的订餐系统)(5)——领导“突发奇想”
  7. java 手机声音提醒功能_Android基于广播事件机制实现简单定时提醒功能代码
  8. 湖南科技大学研究生院计算机学院,湖南科技大学计算机科学与工程学院
  9. UVA 11384 Help is needed for Dexter (递归函数)
  10. js中的reduce函数详细解释