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信息。

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

VO(Value Object,值对象)

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

用途:主要用于将某对象/层传递到其他对象/层,目的是用来通过减少网络对话,以加速层之间的数据交换。

注意:VO通常包含有一组私有变量和获取这些变量的方法,并且必须是可序列化的,只有通过序列化才可以传递给其他对象/层。

实现VO映射要做的第一件事情是调用flash.net.registerClassAlias函数注册ActionScript类。

.net方要有一个类,Actionscript方也要有一个相同的类,交互的时候就会自动映射了。

注意:registerClassAlias的注册名一定要和.net中的映射名对应。

从.net映射到flash,在flash那边接收的是flash定义的类,不再是返回的.net类。相反也一样。

他们的类名可以不一样,但是要使用配置文件建立映射。

FluorineF允许为远程服务或者方法定义别名。这要修改配置文件。

看张亚飞《.Net for Flash FMS》的笔记相关推荐

  1. Flash/Flex学习笔记(51):3维旋转与透视变换(PerspectiveProjection)

    Flash/Flex学习笔记(49):3D基础 里已经介绍了3D透视的基本原理,不过如果每次都要利用象该文中那样写一堆代码,估计很多人不喜欢,事实上AS3的DisplayObject类已经内置了z坐标 ...

  2. Flash/Flex学习笔记(30):不用startDrag和stopDrag的对象拖动

    对于从Sprite类继承来的对象,要实现拖放当然是Flash/Flex学习笔记(13):对象拖动(startDrag/stopDrag) 里讲的方法最方便,但是对于不是从Sprite类继承得来的对象, ...

  3. 《看不见的森林:林中自然笔记》书摘一

    笔记摘自 看不见的森林:林中自然笔记 [美]戴维·乔治·哈斯凯尔 2017年10月17日 序 ,喇嘛与学生从事的是同样的工作:凝视一座坛城,提升自己的心灵.这种相似性并不止于语言与象征意义上的重合,而 ...

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

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

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

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

  6. 张亚飞《.Net for Flash FMS》读后笔记一

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

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

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

  8. flash 与3D笔记:图片墙(1)

    一: 方形的图片墙 对3D还是一点也不熟悉,东拿西拿才把这个拼合的图片墙拼起来了,但是涉及到很多细节方面比较多.特别是rotationX rotationY之后的偏移问题,对构建存在一点问题.初步有一 ...

  9. 看李俊超老师SEO视频教程 全程笔记

    SEO教程详解 一次偶然的机会发现了百度文库新推出的公开课栏目,并在其中发现了的李俊超老师的SEO视频教程,从中学到了很多知识.并在观看的过程中做了如下笔记: 核心思想及工作流程 1.内容为王,外链为 ...

最新文章

  1. [Contest20171109]函数(lipshitz)
  2. (转)Javascript面向对象编程(二):构造函数的继承
  3. PHP7新增的主要特性
  4. MySQL 常用语法 之 DISTINCT
  5. 第三课《让简历有点色彩》
  6. QT对象树、信号和槽机制
  7. 再见 Typora,这款 Markdown 编辑器开源又免费!
  8. [MyBatisPlus]通用枚举
  9. 【渝粤题库】国家开放大学2021春3896人文英语1题目
  10. php如何与数据库连接,PHP文章如何和数据库连接(1)
  11. python调用mysql数据库sql语句过长有问题吗_python连接MYSQL数据库,调用update语句后无法更新数据,解决...
  12. java枚举类型特点_必须了解的高阶JAVA枚举特性!
  13. java list填入table_JavaFX从ObservableList填充TableView
  14. 【Android Studio】入门系列 4.1.Coding 定位目标
  15. day69-oracle 22-DBCA
  16. python编码在哪里看_python怎么换编码
  17. vue3移动端腾讯地图坐标拾取,获取当前定位(腾讯、高德、百度、天地图),火星坐标GCJ-02–>百度坐标BD-09,根据坐标经纬度计算两点距离的方法,点击链接打开地图导航的方法
  18. GHOSTXP_SP3电脑公司装机特别版 V30.0[NTFS]
  19. python点击按钮后跳到另一个页面_js点击button按钮跳转到另一个新页面
  20. 关于Spring MVC 文件大小超过限制后浏览器无响应解决方案

热门文章

  1. 01005封装的优缺点
  2. 路由器到游戏服务器稳定性差,电竞路由器和普通路由器有什么区别!
  3. android安卓仿 win桌面 开源,安卓的XP系统 XP Mod Launcher小体验
  4. 马丁福勒微服务论文网址
  5. 三、PyQt5高级控件的使用
  6. 深入解析ThreadLocal源码
  7. sql server如何修改服务器名称,SQL Server 2014改服务器名称为(local)的方法
  8. 有一种异性朋友叫温暖
  9. matlab混沌信号 仿真,蔡氏混沌电路的分析和MATLAB仿真
  10. 2021年山东省安全员C证考试题及山东省安全员C证报名考试