AMF(Action Message Format)在开发Flash/Flex应用中使用频率是非常高的,相对普通的HTTP、WebService的SOAP等多种数据通信方式的效率更高,有人曾经做过这方面的测试,详细可以访问:http://xinsync.xju.edu.cn/index.php/archives/2162。本文将结合FluorineFx来提供通信服务接口,在客户端通过Flex来访问,简单的介绍下关于使用FluorineFx的AMF(Action Message Format)协议通信的用法。

首先建立一个FluorineFx服务库,并建立一个数据传输对象(DTO),为该对象添加[FluorineFx.TransferObject]表示该对象可以用作于FluorineFx的数据传输对象,这个对象将会在本文后面用到,如下代码块:

namespace FxDotNet.Services.DTO
{
    [FluorineFx.TransferObject]public class Book
    {public int ID { get; set; }public string Name { get; set; }public string Author { get; set; }public double Price { get; set; }public Book()
        { }public Book(int id, string name, string author, double price)
        {this.ID = id;this.Name = name;this.Author = author;this.Price = price;
        }
    }
}

接下来就需要提供一个FluorineFx的远程服务(即标记有[RemotingService]的对象),通过该服务提供对外访问的方法接口,如下代码块:

namespace FxDotNet.Services
{
    [RemotingService]public class DataServices
    {public DataServices()
        {
        }///<summary>///获取服务端的系统时间///</summary>///<returns></returns>public string GetServerTime()
        {return DateTime.Now.ToString();
        }public ArrayCollection GetBooks()
        {
            ArrayCollection array = new ArrayCollection();
            array.Add(new Book(1, "三国演义", "罗贯中", 100.00));
            array.Add(new Book(2, "西游记", "吴承恩", 200.00));
            array.Add(new Book(3, "水浒传", "施耐庵", 300.00));
            array.Add(new Book(4, "红楼梦", "曹雪芹", 400.00));return array;
        }
    }
}

通过FluorineFx网站来宿主该远程服务,通过Flex的配置文件services-config.xml配置远程访问的AMF连接通道。

<channels><channel-definition id="my-amf"class="mx.messaging.channels.AMFChannel"><endpoint uri="http://{server.name}:{server.port}/{context.root}/Gateway.aspx"class="flex.messaging.endpoints.AMFEndpoint"/><properties></properties></channel-definition></channels>

FluorineFx提供的远程服务(RemotingService),使用Flex、Flash或Silverlight开发的客户端都是可以访问的,要实现客户端的远程调用其实是很简单的,这里以Flex作为示例进行演示,设置通信协议为AMF3,然后直接调用当前连接到服务器端连接对象的call()方法就可以实现远程调用,详细请查看下面完整的Flex示例。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()" fontSize="12">
    <mx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.List;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;private var nc:NetConnection;private var rs:Responder;private function init():void
            {
                nc = new NetConnection();
                rs = new Responder(onResult,onStatus);
                nc.objectEncoding = ObjectEncoding.AMF3;
                nc.connect("http://localhost:2311/FxDotNet.Web/Gateway.aspx");
                nc.client = this;
            }private function onResult(result:String):void
            {this.lbServerTime.text = "服务端系统时间为:" + result;
            }private function onStatus(event:Object):void
            {
                trace("Error");
            }private function getServerTime(event:MouseEvent):void
            {//服务器端所提供的RemotingService的全限定名nc.call("FxDotNet.Services.DataServices.GetServerTime",rs);
            }        
        ]]>
    </mx:Script>
    <mx:Button x="19" y="28" label="获取服务器系统时间" click="getServerTime(event)"/>
    <mx:Label x="19" y="60" width="402" id="lbServerTime"/>
</mx:Application>

同样可以使用AMF来做大数据的传输,比如要传递一个集合、数组、DataTable或是DataSet等,下面以集合做为示例演示,ActionScript 3.0中新增了ArrayCollectin类,FluorineFx在服务器端对ActionScript 3.0的ArrayCollection对进行了序列化映射封装,服务端FluorineFx.AMF3.ArrayCollection类型的对象可以直接被客户端的ArrayCollection所接收。

如上面FluorineFx所提供的远程服务接口中的GetBooks()方法,Flex调用此方法就会得到一个ArrayCollection对象,通过调试跟踪返回的数据可以很清楚的分析这些数据,如下图示:

详细请看下面的Flex完整示例代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12" 
    width="541" height="302" creationComplete="init()">
    <mx:Script>
        <![CDATA[
            import mx.collections.ArrayCollection;
            import mx.controls.List;
            import mx.rpc.events.FaultEvent;
            import mx.rpc.events.ResultEvent;private var nc:NetConnection;private var rs:Responder;private function init():void
            {
                nc = new NetConnection();
                rs = new Responder(onResult,onFault);
                nc.objectEncoding = ObjectEncoding.AMF3;
                nc.connect("http://localhost:2311/FxDotNet.Web/Gateway.aspx");
                nc.client = this;
            }private function getBook(event:MouseEvent):void
            {
                nc.call("FxDotNet.Services.DataServices.GetBooks",rs);
            }private function onResult(result:ArrayCollection):void
            {this.bookGrid.dataProvider = result;
            }private function onFault(event:Object):void
            {
                trace("Error");
            }
        ]]>
    </mx:Script>
    <mx:Button x="44" y="46" label="获取图书信息" click="getBook(event)"/>
     <mx:DataGrid x="44" y="78" id="bookGrid">
          <mx:columns>
              <mx:DataGridColumn headerText="编号" dataField="ID"/>
              <mx:DataGridColumn headerText="书名" dataField="Name"/>
              <mx:DataGridColumn headerText="作者" dataField="Author"/>
              <mx:DataGridColumn headerText="价格" dataField="Price"/>
          </mx:columns>
      </mx:DataGrid>
</mx:Application>

除了使用FluorineFx所提供的ArrayCollection外,同样可以使用我们熟悉的Object[],List<Object>,DataTable等常用类型来作为数据返回的类型,其中Object[]和List<Object>类型的数据返回到客户段能够直接被客户端所接收,如下使用Object[]作数据返回类型的代码块:

/*************服务端方法*************/public Book[] GetBookArray()
{
    Book[] book = new Book[]
    {new Book(1, "三国演义", "罗贯中", 100.00),new Book(2, "西游记", "吴承恩", 200.00),new Book(3, "水浒传", "施耐庵", 300.00),new Book(4, "红楼梦", "曹雪芹", 400.00)
    };return book;
}/*************客户端方法*************/private function onResult(result:Array):void
{//}

下面是以List<Object>类型返回的代码示例代码,客户段可以使用ArrayCollection直接接收:

/*************服务端方法*************////<summary>///以泛型类型返回给客户端///</summary>///<returns></returns>public List<Book> GetBookList()
{
    List<Book> list = new List<Book>
    {new Book(1, "三国演义", "罗贯中", 100.00),new Book(2, "西游记", "吴承恩", 200.00),new Book(3, "水浒传", "施耐庵", 300.00),new Book(4, "红楼梦", "曹雪芹", 400.00)
    };return list;
}/*************客户端方法*************/private function onResult(result:ArrayCollection):void
{//}

如果要使用DataTable类型做方法的数据返回类型就需要注意下,服务器端直接返回DataTable类型的数据客户端是不能直接接收解析的,要使客户断方便解析所返回的DataTable类型数据,FluorineFx提供了DataTableTypeAttribute,为返回DataTable类型的方法加上DataTableTypeAttribute后返回给客户端,客户端就可以直接使用ArrayCollection接收了。

/******************服务端方法***********************/
[DataTableType("Book", "FxDotNet.Services.DTO.Book")]public DataTable GetBookTable()
{
     DataTable dt = new DataTable("Book");
     dt.Columns.Add("ID", typeof(int));
     dt.Columns.Add("Name", typeof(string));
     dt.Columns.Add("Author", typeof(string));
     dt.Columns.Add("Price", typeof(double));
     DataRow dr = dt.NewRow();
     dr["ID"] = 1;
     dr["Name"] = "《三国演义》";
     dr["Author"] = "罗贯中";
     dr["Price"] = 100.00;
     dt.Rows.Add(dr);
     dr = dt.NewRow();
     dr["ID"] = 2;
     dr["Name"] = "《西游记》";
     dr["Author"] = "吴承恩";
     dr["Price"] = 200.00;
     dt.Rows.Add(dr);
     dr = dt.NewRow();
     dr["ID"] = 3;
     dr["Name"] = "《水浒传》";
     dr["Author"] = "施耐庵";
     dr["Price"] = 300.00;
     dt.Rows.Add(dr);
     dr = dt.NewRow();
     dr["ID"] = 4;
     dr["Name"] = "《红楼梦》";
     dr["Author"] = "曹雪芹";
     dr["Price"] = 400.00;
     dt.Rows.Add(dr);return dt;
}/******************客户端方法***********************/private function onResult(result:ArrayCollection):void
{//do other}

关于FluorineFx的AMF就简单介绍这些,要想了解更多的Flex客户端与.NET服务器端通信,可以访问 这里 。

本文示例代码下载 FluorineFxAMF.rar

Flex与.NET互操作(十四):FluorineFx的AMF协议通信相关推荐

  1. Flex与.NET互操作(十二):FluorineFx.Net的及时通信应用(Remote Shared Objects)(三)

    远程共享对象(Remote Shared Objects) 可以用来跟踪.存储.共享以及做多客户端的数据同步操作.只要共享对象上的数据发生了改变,将会把最新数据同步到所有连接到该共享对象的应用程序客户 ...

  2. Flex与.NET互操作(十):基于FluorineFx.Net的及时通信应用(Real-time Messaging Applications)(一)...

     使用FluorineFx.Net开发的每一个实时通讯功能应用都拥有一个应用程序适配器(ApplicationAdapter),用来管理整个实时通讯应用的生命周期,以及接受和拒绝客户端的连接等.应用程 ...

  3. Flex与.NET互操作(十三):FluorineFx.Net实现视频录制与视频回放

    本文主要介绍使用FluorineFx.Net来实现视频录制与视频回放,FluorineFx如同FMS一样,除了有AMF通信,RTMP协议,RPC和远程共享对象外,它同样具备视频流服务的功能.通过它我们 ...

  4. Flex与.NET互操作(九):FluorineFx.NET的认证(Authentication )与授权(Authorization)

    FluorineFx.NET的认证(Authentication )与授权(Authorization)和ASP.NET中的大同小异,核实用户的身份既为认证,授权则是确定一个用户是否有某种执行权限,应 ...

  5. 【Vue3 第十四章】父子组件通信

    数字化管理平台 Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus 权限系统-商城 个人博客地址 一.概述 在Vue的框架开发的项目过程中,经常会用到组件来管理不同 ...

  6. CCNA笔记之第十四节:RIP协议(1)

    1. RIP:路由选择信息协议:(Routing Information Protocol) 1) Metric:跳数 (RIP只适合小网络,最大跳数16跳:第16跳不可达) 2) 管理距离值:(AD ...

  7. HCIP第十四天(MPLS协议)

    目录 MPLS(多协议标签交换) 包交换 标签交换 包交换的优化过程 MPLS(多协议标签交换) 包交换 数据组成数据包,在网络中的各个节点传递,最准到达目标,即路由转发的过程. 1.查两张表,即路由 ...

  8. Flex与.NET互操作系列文章

    本系列文章主要介绍了关于Flex与.NET结合开发中的一些互操作性,包括网络通信.数据加载.数据传输.文件传输.以及应用于Flex与.NET协作开发的通信网关开源项目FluorineFx的相关知识点. ...

  9. Flex与.NET互操作系列文章索引

    本系列文章主要介绍了关于Flex与.NET结合开发中的一些互操作性,包括网络通信.数据加载.数据传输.文件传输.以及应用于Flex与.NET协作开发的通信网关开源项目FluorineFx的相关知识点. ...

最新文章

  1. 清晰易懂的Focal Loss原理解释
  2. Mysql的row_format(fixed与dynamic)
  3. 写自己的一个pdo数据库操作框架
  4. java多对多关联数据操作,hibernate实施多对多关联查询时,关联表数据被删除
  5. java_opts gc回收器_JVM之垃圾回收机制(GC)
  6. (转)Linux环境变量的设置和查看方法
  7. C# 调用Word(PrintOut) 直接打印,出现“第一节的页边距设于可打印区域之外,是否继续”...
  8. 【JZOJ3397】【luoguP4556】雨天的尾巴
  9. Django从理论到实战(part30)--Meta配置
  10. zabbix查看mysql同步_Zabbix 检测Mysql数据库的主从同步
  11. python scrapy框架基如何实现多线程_Python实现在线程里运行scrapy的方法
  12. Spring AOP之HelloWorld与概念介绍(xml版)
  13. MySQL 5.7 解压版 安装教程(图文详细)[Windows](转载)
  14. Andirod——网络连接(HttpURLConnection)
  15. Vue动态权限路由addRoutes执行初次白屏解决方法。
  16. 程序员相亲图鉴,太真实了!
  17. MySQL5.7 InnoDB官方文档中文版[猿教程]
  18. python 画直方图
  19. 世界好疯狂呢,神奇小子,开源了他的自动驾驶软件
  20. c语言求数组交集并集差集,求两个数组的交集、并集和差集算法分析与实现

热门文章

  1. QT的QUdpSocket类的使用
  2. C++函数调用运算符重载
  3. c/c++的“大小,长度
  4. C语言的关键字 extern
  5. 材料成型计算机模拟第三版,材料成型计算机模拟实验报告模板学习.doc
  6. 上大专是学计算机还是会计,上三本还是上专科 大专学什么专业好
  7. 16_clickhouse,HDFS引擎,JDBC引擎
  8. 05_pandas读写文件,读写数据到CSV,HDF5,Excel中
  9. B02_NumPy数据属性(ndarray.ndim,ndarray.shape,ndarray.itemsize,ndarray.flags)
  10. Spring4中的@Value的使用(学习笔记)