zoukankan      html  css  js  c++  java
  • 介绍Flash remoting之.net方面的应用

    本文介绍Flash remoting之.net方面的应用.
    在很久很久以前(as1&as2)我们使用Flash remoting组件与服务器端进行数据通信,所使用的文件格式我们称为AMF.而AMF3是flex/as3与后台通讯协议所采用的文件格式,可以传递基本类型及resultset等自定义对象,flash remoting和local connection都采用这种文件格式来传输数据.除去本身就提供支持的Coldfusion,目前还有针对其他的几种语言的开源库如OpenAMF (J2EE), Fluorine (.Net),Flashticle (Python),AMFPHP(php)等。不一一列举了,这里就介绍一下基于Fluorine的Remoting开发.官方网站如下:http://www.fluorinefx.com/

    目前Fluorine的最新版本为FluorineFX,以前老版本的Fluorine仍然提供支持.使用Flourine,


    我安装的是VS2005,下面是我的配置流程(必须安装了flourine):
    打开新建工程.在Other Project Types中选择Visual Studio Solutions.新建一个Blank Solution.名字默认即可.

    Solution Explorer里右击刚生成的Solution "Solution1",添加一个Project.名字也为默认即可.这里我要说一下,名字其实关系不是很大,我们到后面取remoting的gateWay时有很方便的办法,所以不用担心会搞混.

    添加一个C#项目,选择FluorineFx ServiceLibrary,目前FluorineFx只支持C#。同样使用默认的名字。

    然后接着添加一个网站,选择FluorineFx ASP.NET Web Site

    完成以后右边的Solution Explorer中应该是如下这样的。而Sample.cs就是remoting方法所在的文件。可以看到,默认有一个Echo方法。


    查看“F:\...\Web Site”的属性,可以发现“引用”(reference)中已经包含了如下引用:

    接下去右击“F:\...\Web Site”,设为启动项“Set as Startup Project”,然后右击Console.aspx设为首页“Set as Startup Page”,用于调试。

    所有装备工作都完毕了,可以按“Start Debugging”按钮进行调试了。调试时会直接进入控制台。可以在左边的树中发现Echo方法,Echo方法定义为输入一个字符串,返回相同的字符传:可以通过test界面方法来测试。

    输出结果如下,表示已经成功:

    至此,后台的配置已经基本完成了。





    本文主要介绍如果实现AS3和C#联用的Flash remoting实现.后台的配置可以看《AS3笔记(14),Hi! Flash remoting(1)-Fluorine》。与Coldfusion使用remoting的简单相比,任何第三方后台都只能用麻烦来形容,可惜Coldfusion在中国。。。不提了。进正文。

    首先,此remoting非彼remoting,与.net中的remoting不同,这里的remoting指的是Flash通过AMF文件格式与后台的交互功能。Flash remoting是as1和as2中的组件,在Adobe的产品列表中有flash remoting mx组件,该组件封装了Flash中对于AMF的操作。而在As3中,虽然依然有AMF的操作,但是官方已经不再其实已经没有remoting的概念了。

    从方法上来看,以前操作remoting的remoting包和rpc包也已经不再存在了。As3将主要的方法并入了NetConnection。而如rpc下的很多功能则被分了出来,如Responder类。详细可以看flash.net 包。

    下例为一个简单的Hello world范例:

    /*@
    Author:frank
    Site:www.2solo.cn
    Date:2008.02.19
    Info:remoting for .net with fluorinefx
    */

    package {
        import flash.display.Sprite;
        import flash.text.TextField;
        import flash.text.TextFieldAutoSize;
        import flash.text.TextFormat;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import fl.controls.UIScrollBar;
        import flash..net.NetConnection;
        import flash..net.ObjectEncoding;
        import flash..net.Responder;


        public class amf3Csharp extends Sprite {
            public static var uiSb:UIScrollBar=new UIScrollBar();
            public static var btn=new test_btn;
            public static var labelTxt:TextField;
            public static var inputTxt:TextField;
            private static var nc:NetConnection new NetConnection();

            public function amf3Csharp() {
                addMC();
                dispatchBtn(btn);
                setUpNC();
            }
            /*
            网络连接设定
            */

            private function setUpNC() {

                nc.client = nc;
                nc.objectEncoding = flash..net.ObjectEncoding.AMF3;
                nc.connect("http://localhost/Gateway.aspx");

            }
            /*
            场景元素定义按钮事件
            */

            private function addMC() {
                btn.x=30;
                btn.y=150;
                addChild(btn);
                labelTxt = new TextField();
                labelTxt.border = true;
                labelTxt.height=100;
                labelTxt.width=400;
                labelTxt.y=200;
                labelTxt.x=20;
                labelTxt.appendText("www.2solo.cn/log By frank");
                addChild(labelTxt);
                inputTxt= new TextField();
                inputTxt.multiline=true;
                inputTxt.border = true;
                inputTxt.height=100;
                inputTxt.width=400;
                inputTxt.y=20;
                inputTxt.x=20;
                inputTxt.type="input";
                inputTxt.text="Hello world!:)";
                addChild(inputTxt);
                uiSb.scrollTarget=labelTxt;
                uiSb.direction="vertical";
                uiSb.setSize(labelTxt.width,labelTxt.height);
                uiSb.move(labelTxt.x + labelTxt.width,labelTxt.y);
                addChild(uiSb);
            }
            /*
            定义按钮事件
            */

            private function dispatchBtn(target):void {
                target.addEventListener(MouseEvent.CLICK,btnClick);
            }
            /*
            按钮事件
            */

            private function btnClick( event:Event ):void {
                labelTxt.text="发送Echo事件"+"\n"+labelTxt.text;
                nc.call("ServiceLibrary1.Sample.Echo",new Responder(SuccResult,OtherStatus),inputTxt.text);
                uiSb.update();
            }
            /*
            Remoting成功事件
            */

            private function SuccResult(re:String) {
                labelTxt.text=re+"\n"+labelTxt.text;
                trace("成功!");
            }
            /*
            Remoting失败事件
            */

            private function OtherStatus(re:Boolean) {
                trace("错误!");
            }
        }
    }

    其中Remoting方法的ServiceLibrary1.Sample.Echo路径可以通过Fluorine的控制台来取,如下图中,Service:ServiceLibrary1.Sample就是一个服务地址:

    这个范例可以将上面的文本中的文字通过AMF发送到服务端的Echo方法,并将返回值输出到下面的文本中。

    最后附上范例:http://www.2solo.cn/upload/amf1_2soloDOTcn.zip 

  • 相关阅读:
    WCF HelpPage 和自动根据头返回JSON XML
    Jquery及插件 应用
    Autofac Mvc Webapi注入笔记
    TransactionScope 出错 与基础事务管理器的通信失败
    工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)
    Asp.net的异步处理模型Asp.net的异步如何提高服务器的吞吐量
    WCF 契约定义命名空间 的疑问
    常用的18个人情世故
    StatusCode
    web标准常见问题集合
  • 原文地址:https://www.cnblogs.com/chinatefl/p/1444801.html
Copyright © 2011-2022 走看看