Flash/Flex

盘点.NET与flex的通讯方式


():基于 Socket的网络连接Flex也支持基于 Socket的网络连接,服务器端可以是C++,VBC#,Java等任一语言开发。

监听一个网络端口便以接收到Flex开发的客户端的连接ActionScript3.0提供了通过 Socket连按的方式与服务器端通信。

这点是超越传统BS结构的重要特征。

这样使得网络通信可以即时连接,避免了HTTP协议无状态连接的弊病。

ActionScript3:0使用MLSocket类进行连接。

需要注意的是使用ⅹ MLSocket类进行 Socket连接时,不能自动穿过防火墙。

要想穿过防火墙连接,则需要使用基于HTP协议的RTMP协议。

通过査阅 Adobe提供的API文档可以了解到, XMLSocket提供了四个公开方法1、 XMLSocket(host: String= null, port:int=0)-创建一个新的 XMLSocket对象2、 close: void-关闭一个 XMLSocke3、 connect( host String, port: int))丶oid-连接到指定的TCP端口4、 send(object*)vojd-将数据发送到连接服务端OK,了解这些后我们就可以用 XMLSocket来开发基于 Socket的网络及时通信应用。

下面通过C#提供一个 Socket的服务端,并监听8888端口。

示例程序如下I using System;2 using System. Collections. Generic3 using system. Li4 using System. Text5 using System. Net. Sockets6 using System.IO7DC(n9{classProgram01234561890staticvoidMain(string[]args)TcpListener listenertristener=new Tcplistener(8888)catch( Exceptionex)Console. Wr ine(ex Message)listener. Start;Console. Writeline("服务器启动,等待客户端连接");28boolloop=truewhile( loop)Socket s=listener. AcceptSocketONetworkStream ns-=new Netw ork Stream(s);Stream Reader reader new Stream Reader(ns)string result=string. Empty;result=reader. ReadLineoConsole. WriteLine(result)catch(Exceptionex)Console. WriteLine(ex Message)}服务器端 Socket已经准备完毕,下面看看客户端的 Action Script的 XMLSocket怎么来建立 Socket连接与nt的 Socket服务端进行通信如本文前介绍, Action Script3.0提供了基于 Socket的网络连接类 XMLSocket,我们可以直接使用它来开发基于Socket的网络通信。

如下建立一个基与 Action Script3.0提供的 XMLSocket的网络连接I private function connection ServerO: void3 mlConn=new XMLSocketo4 xmlConn connect(127.0.0.1,8888)in随后,便可以通过ⅹ MLSocket的实例方法 sendo向 Socket服务端发送消息了。

如下代码定义:private functionon SendO voidXmIConn. send( txt Data. text+"n")客户端完整代码:1223 25 26如下为本文示例程序测试结果图发个消息测试是否可连接到C#的S0cket服务端连接发送cr file C: Documents and Settings/ Administr ator, 826E3725CE16481个消息测试是否可连接到Cm的 Socket服务端。

丁文章出处:htp/beniao.cnblogs.(一):基于 Web Service F.据访间(bom本文以NET平台下C#语言开发的 WebService作为远程 Webservice,详细介绍Fkex与NET的 WebService的数据通信知识点;包括连接 Web service,远程调用 WebService方法,给 WebService方法传递参数等相关知识点。

三个标签的使用方法基本上是一样,这里就以标签为例进行介绍。

首先看看如下代码块:sd":/locahost/flashflex/dataWebservice.asmx?wsdluseProxy="false>6 sd属性指定到要访问的 Web Service的wsd地址既可,其中定义了两个操作标签(< mx: operation>),分别对应于 Web Service中定义的 Web Method方法。

result属性标记访问 WebService方法成功后的处理函数;faut则相反指定于访问失败的处理函数。

以上两个< mx: operation>对应于 WebService的 WebMethod方法如下:5 [ WebMethod6 public string Hello Worldreturn"Hello Worldl1∥/< summary>12∥/返回一个简单对象13 ///15 WebMethod16 public Book Get Booketurn new bookId=1ame="三国演义"Author="罗贯中",Price=100如上便是 WebService方法定义和在Flex的客户端(mxm)通过标签来访问 Web Service的完整流程,下面我们来看看在Flex的客户端怎么去调用 Web Service所定义的方法1通过上面的调用,就可以完成一个Flex和 Net WebService的交互。

当然我们在Flex的客户端调用 WebService也是可以传递参数的,如下 WebService的 WebMethod定义∥/将传递进来的参数转化为大写字符返回4 /paramname"value">//6 WebMethod7 public string ConvertToUpper(string value)8returnvalue. ToUpperO通过在执行该方法就可以访问了,如下1234*向 WebService发起请求4 internal function on Request(: voidCndata Service. Convert ToUpper(abcdefg")回到前面看看 WebService的方法定义,其中一个方法 Get Book是返回的一个Book对象,如果是返回的对象我们在Fkx的客户端怎么来获取这个对象的值呢?详细见如下代码示例:1 internal function onobjecto: voiddata Service. Get Book:6 internal function on ObjectSuccess(evt: Result Event): void∥直接通过事件的 result属性得到返回值,然后直接访问属性便OKAlert. show(evt.result. Name);23456请求失败的处理函数internal function on Fault(evt: Fau It Event) voidAlert.show("访问 WebService失败!");如上便完成了服务端的 WebService返回对象到客户端的调用(三):基于ebservice的数据访问(下)在上一篇文章《(二):基于 WebService的数据访间()》中介绍了通过
实际上我们也可以通过编程的方式动态的访问 WebService, Flex SDK为我们提供了 WebService类使用 Web Service类来访问 Web service其实也就是将< mx: Web service>标签的属性通过类对象的属性形式来表,相比之下使用 WebService类比使用标签要灵活。

下面我们来看看编程方式怎么连接和调用远程方法internal function on Click(: voidWeb Service=new WebService(service.loadwsdl(://localhost:1146/flashflexService.asmx?wsdi)service. addEventListener(Result Event. RESULT, on Result)6service. add EventListener( Fault Event. FAULT, on Fault)service. GetBooko直接通过类对象的 load WSDLO方法调用远程 WebService,动态为类对象指定相关的处理函数,然后和标签样调用远程 WebService方法既可internal function onResult(evt Result Event ): voidAlert. show(evt result. Id)6 internal function on Fault(evt Fau lt Event): voidinAlert. show(evt fault. fault Detail to String)如上便完成了使用 WebService类通过编程的方式访问远程 Web Service方法的调用。

下面来看看 WebService返回 DataTable等奂责类型,在Flex客户端该怎么解析。

首先定义 Web Service方法如I [WebMethod( Description="该方法将返回 DataTable类型的数据")]2public Data Table Get Data Table4 Data Tabledt-=new Data Table("Books")5 dt Columns. Add(ld, typeof(int))6 dt Columns. Add("Name", typeof(string))7 dt Columns. Add("Author", typeof(string)8 dt Columns. Add("Price, typeof(double))10 DataRow dr=dt. New Row 0;11 dr[ld=1;12dr[Name"}="《Flex游戏开发》13dr[" Author"]="张三14dr[" Price"]=54.85;15 dt Rows. Add(dr)17 dr=dt. New Row 0;18dr["ld"]=219 dr[Name""《 Flash游戏开发》";0dr[" Author"]="李四21dr[" Price"]-65.50;22 dt Rows. Add( dr);4 return dt同样在Flex客户端通过 Webservice来访问就可以了,下面是使用标签访问(这里需要注意< mx operation>标签的name必须与服务端的 WebService方法同名)wsdh"://locaihost:1146/dataWebServiceasmx?wsdiuseproxy=fals5
提供好了 Webservice,客户端也连接上了 WebService,现在只差调用 WebService提供的远程方法了。

如下:internal function on Table voidmyService. add EventL istener(Result Event. RESULT, on Success)my Service. add EventL istener(Fault Event FAULT, on Fault)45678my Service. Get Data Table. sendointernal function on Success(evt: Result everid//book Grid dataProvider=this. my Service. Get Data Table. lastResult Tables Books. Rowsl1}13 internal function on Fault(evt Fau lt Event): voidAlert, show("调用 WebService方法失败,详细:" Hevt fault. fault Detail. toString)将 WebService的返回值绑定在Flex的 Datagrid组件,mxm的相关代码如下12 4Data GridCo lumnheader Text= dataField="ld"/>8113 14通过 Data Grid的 data Provider属性绑定 Data grid组件的数据源,除了直接通过"{}"绑定表达式帮定外我们也可以在调用远程方法成功的处理函数里给 DataGrid指定数据源,见上面代码中注释的代码部分{this. my Service. Get DataTable. lastResult Tables. Books.Rows}表示将远程 WebService方法 GetData Tabled的返回结果ta Table)的所有行作为数据源与Data(rid组件进绑定,其中 Books为数据源 DataTable的 name,详细见前面Webservice方法的定义出。

程序运行结果如下图编号书名作者价格《Fex游戏开发》张三《Fash游戏开发》李四65,5TatableDataSet, DataTable相比泛型集合来说,性能上有很大的差距,复杂的序列化和反序列化过程也很负责20推出泛型到现在,我一直就比较喜欢用泛型来传递大数据。

OK,下面我将介绍下在Flex中怎么去处理 Webservice方法返回的泛型集合数据。

我们有如下 WebService方法定义:1[ WebMethod( Description-"该方法返回泛型集合2 public List< Book> Booklist3456return new ListC(nnew BookNme"《Hkx游戏开发》Author="张三"Price=54.85new Book14Name="《Fash游戏开发》Author="李四Price=65.5ml yarsnna'1 D"encodngeutf-rbcarAyofbl'mminyaw"litp://ww.wlorn/2001/xmlschema-inwonme申yep//种0/2001/XMLa'://teuri.oru/cl1心dca《F印看或开发》心/年yalthar集三心/A比》54样5心c动cobttcanName《Fles戏开发》)的形式返回的数据形式,相比 Datatable的返回结果更为简洁,明了。

话说到此,我在Flex下该怎么去获取这个返回值和处理这个值呢?其实这里已经很清楚的展现了我们可以通过什么方式去处理,仔细看上图会发现" ArrayOf Book"????这是什么东西?莫非是在客户端可以通过数组的形式得到这个返回值。

为了进一步搞清楚这里面的的点点滴滴,我们需要深入到内部去了解下返回值的具体构造,通过Fleⅹ Builder的调试环境可以得到如下信息◆ inherited4 d BookListmx rpc soap. mxml operation(@339a359)p o active Callsmxrpc Active Calis(@3374ee1)D e argumentsObject ((@3297f11)d asyncRequest mx rpc AsyncRequest(@318c769)mx rpc soap. SoAPDecoder(@35d0b81d encodermxrpc soap SoAPEncoder((@34f5881)d endpointURIIttp: Localhost 1146/DataWeb Service. asmxd torcePartarrays talseo. handle Axis Session faeheadersd ignorewhitespace trueinlastRemx collections Array Colection(@34f5701)dP AuthoJame《Fex游戏开发d object Object(@35b71a1)PricedocIn. "045A8368069122A-7985F96BDF727●[114 d source Array(@34f0191)mx utils. ObjectProxy((349b749)mx, utils. objectProxy (@@349b8b1)d length2看清楚了吗? Book List方法的 last Result结构集下有两个对象,点开节点可知正是我们通过List返回的两个Book对象,而 lastResult的类型是: mx. collections. Array Collection,这不真是 ActionScript中的数组集合吗?好的,既然这样,在Flex客户端便可以直接通过 last Resu得到 Web Service返回的泛型集合数据了。

如下代码块I internal function on Table( void3 my Service. add Event Listener(Result Event. RES ULT, onSuccess)4 my Service. add EventListener(Fault Event FAULT, on Fault)myService. BookList. sendointernal function onSuccess(evt: Result Event): voidar arr C Array Collection=this. my Service. BookList. lastResult as Array Collectionbook grid dataProvider=arrC14internal function on Fault(evt: Fau lt Event) void16 Alert. show("调用 WebService方法失败,详细:"+ evt fault. fault Detail. toString);18}对应的mxm代码如下(运行结果和上面返回 DataTable类型一样)mx: PaneIx=41"y=123"width=480"height=279layout="absolute"fontSize=12">49 10 1113关于 Web Service的数据访问就介绍到这里,由于个人能力有限,文中有不足之处还望大家指正。

如果有什么好的建议也可以提出,大家相互讨论,学习,共同进步!!(四):使用 Httpservice、 URLReqeust和 URLLoader加载/传输数据在前两篇文章中分别介绍了Fkex与NET的 WebService之间的数据交互通信知识,本文将介绍另外一种加载数据以及发起请求的方式。

ActionScript3.0中提供的数据加载请求类主要是 HttpseRvice, URLLoader和 URLRequest可以通过他们协同来完成数据加载和请求。

下面我么便来看看这三个类是怎么来完成数据加载工作在本地IS服务器上有如下定义的XML文件123 415《三国演义》6< Author>罗贯中7 52.308 102《西游记》12< Author>吴承恩< Author>3 39.9114 16317《红楼梦》18< Author>曹雪芹19 48.2020
21 243《水浒传》24< Author>施耐庵25 398527使用 HttpseRvice传递和加载数据使用 HttpserVice可以实现加载数据,也可以实现参数传递,下面通过两个示例程序来讲解这两个知识点首先来看看 HttpserVice加载数据的方式。

在Flex中使用 HttpseRvice来装载外部数据是非常简单的,他是基于HTP协议发送POST和GET请求外部数据,然后通过指定的监听方法来处理响应。

我们可以通过标签来完成对数据源的连接,也可以通过可编程方式来处理,两种方式没什么大的差距,实际开发中可以根据自己喜好选择I internal function on Click: void3 var service HttpsErvicEnew HttpsErvicEo4ervice.url"://localhost:1146/data/book.xml",service. useProxy-fals6 service result Format=e4x7 service. add Event Listener(Result Event. RESULT, on Result Handler)crvice sendom丁1l internalfunctiononResult Handler(evt: Result Event): voidarxml: XML-evt resultas XMLdocIn. 14 trace(xml);15 book Grid dataProvider=xml. Book该示例的运行结果见文章最后,下面是这个示例的完整代码:完整示例代码23 mx columns313441OK,我们来看看使用 HttpseRvice传递参数到服务端是怎么实现的。

使用 HttpserVice传递参数可以通过两种方式实现,分别如下1、直接在请求URL后面跟上参数列表,如:htp/ localhost/web/ Test. aspx?a=1&b=2。

2、通过 Flex SDK为我们提供专门用语参数传递的对象( URLVariables)来实现下面以一道简单的加法运算来演示 HttpseRVice传递参数的使用,在Flex里将需要进行加法运算的两个数传递到NET服务端并计算其和后返回给Flex客户端,两种方式传递没有太大的区别,详细请看如下代码演示2*通过RUL参数直接传递4internalfunctionon Click(: void6 varservice HttpsErvicE=nEw HttpsErvicE(:7 vara: String-txt A textB te9service.urh://localhost:1146/operationHandler.ashx?a=+a+&b=+b10 service.useProxy=false1 service result Format="e4x12 service. add Event Listener(Result Event. RESULT, onResult handler)13 service. sendo17*通过 URL Var iables进行参数传递18**/19internalfunctionon Click(: vo21 varservice HttpsErvice=new HttpseRvice(22 service urf"httP: //localhost: 1146/operat ion Hand ler. ashx23 service. useProxy=falseservice result Format=e4x25 service. add EventListener(Result Event. RESULT, onResuIt Hand ler)26 varparam: URLVar iab les-new URL Variables27 param. a=txtA text;28 param. b=txtB textservice. sendo下面是完整的示例代码,可以把 on Click方法相互切换来测试两种不同的参数传递方式完整的示例代码I23 >mx: Labelx-252y=12"A+B丁58Operation Handler. ashxnhandler: I Http hand ler2{bublicvoidprocessRequest(Contextcontext)4567891{context Response Content Type="text/plain"ta=int Parse(context Request QueryString"a"D)intb=int. Parse(context Request QueryString[b"])context Response. Write((a+).ToStringO)1234567814 publicboolls Reusablereturnfalse21}上面示例的运行界面截图使用 HttpseRvice传递参数A:11:22A+B:33计算二、了解 URLReqeust使用 URLRequest类可捕获单个HTP请求中的所有信息。

将 URLRequest对象传递给 URLStream或URLLoader类以及其他加载操作的 load方法以启动URL数据加载。

它的使用很简单,通过构造方法构造对象就varrequestequest=new UrlrEquesT("hTtp: //locahost: 1146/data/book.xml)同样可以使用 URLRequest来请求一个本地项目应用里的文件,如下代码示例varrequest: URLRequest=new URLRequest("Data/Book. xml")URLRequest虽然功能强大使用简单。

但我们还是需要了解更多的东四,以便可以正确的应用 URLRequest类和处理相应的错误。

其中最引人关注的就是安全沙箱的问题,这部分我将在以后的文章中介绍,这里只需要记住两点就OK。

1、如果执行调用的SWF文件在只能与本地文件系统内容交互的沙箱中,而目标资源来自网络沙箱,则不允许进行数据加载2、如果执行调用的SwF文件来自网络沙箱而目标资源在本地,也不允许进行数据加载。

这里就简单介绍这些,关于 URLRequest的详细资料大家可以查看官方提供的在线文档://livedocs.adobe/flash/9.0/actionScriptlangrefv3/Flash/net/urlRequesthtmL三、使用 UR LOader加载数据URLLoader类可以以文本、二进制数据或URL编码变量的形式从URL下载数据。

下面将结合使用本地服务你那我们、取来加载它呢?很简单,使用上面介绍的URLR四米创建请求连接,然后将的数据(详细见文章前面的xml文件定义)的加载示例来演示 URLLoader的使用方法。

的load方法来实现数据加载I interna lfunctiononClicko: void3 varrequest: UrlreQuesTnew UrlrEquesT(hTtp: // localhost: 1146/data/book. xml")4 varloader: URLLoader-new URLLoader0;5 loader load(request)6 loader. add Event Listener(Event. COMPLETE, on Comp lete Hand ler)9privatefunctionon Comp lete Handler(evt: Event): void1011 varxml: XML-new XML(evt target data)12 book Grid dataProvider=xml. Book13}下面是整个mxm的代码定义mxml完整代码12interna lfunctiononClicko void56789varrequest: UrlreQuest-new UrlrEquest(httP: //localhost: 1146/data/book.Xml)arloader: URLLoader-new URLLoaderoloader. add EventListener(Event. COMPLETE, on Comp lete Hand ler)privatefunctionon Comp lete Handler(evt: Event): voidvarxml: XML=new XML(evt target data)book grid dataProvider=xml. Book18mx. scr23mx DataGridCo Text-”书名" data Field="Name">x】 Datagrid Columnheader text"价格" data Field=" Price丁x: Button labe-"加载数据" Font Weight=" normal"lick=" on Click(ontrolBommx. Panek33本示例的运行结果如下图使用 URLLoader加在XML独据骗号书名作者价格《三国演义》罗贯中52,30《西游记》吴承恩91《红楼曹雪芹水浒传》施庵加载数据关于 URLLoader的更多资料大家可以查看 Adobe提供的在线文档:/livedocs.adobe/flash/9.0/actionscriptLangrefv3/flash/net/urlloader.html五):使用 FileReference+ Httphandler实现文件上传/下载在Flex的应用开发中,同 ASPNET, JISPPHP等应用一样,都会有上传/下载文件的应用需求,Fex的SDK也为我们提供了专门的类 FileRefUdderence实现文件上传/下载。

Flex只是作为一个客户端,要实现上传或下载必须得为其提供一个服务端来接受上传或下载的请求,本文以 ASPNET中的 Httphandler作为文件上传的服务端来完成上传功能OK,我们从Flx客户端开始,看看客户端是通过什么方式想服务端发起请求。

Flex客户端要完成文件上传下载都是通过 File RefUdderence来实现,首先得定义一个该类型对象实例:1 Bindable2 privatevarstate Text: String="请选择一个文件上传3/通过调用fle对象的方法来完成上传和下载功能4privatevarfile FileReference= new FileReferenceo:上传文件通常涉及到的有选择文件、上传文件以及上传完成这些最基本的处理过程。

OK,下面我们就以这个过程为例来看看Flex是怎么来完成文件的上传功能。

首先为这三个功能点分别添加监听事件处理函数,在程序加载时调用interna lfunctionin it AppO: void3 file. add Event Listener( Event. SELECT, on Selected)4 file. add Event Listener(Event. COMPLETE, on Completed)5 file. add Event Listener(Progress Event PROGRESS, onProgress)点丁另外我们也可以不用上面这中定义一个函数在程序加载时调用进行初始化操作,应用程序(mxmD的初始化操作又 creation Comp lete方法完成,另外还有一个比它先执行的方法 create Children,我们可以直接在mxml下重写该方法来实现应用程序的初始化,如docIn. ate Children比「件更4protectedoverridefunctioncreate Children(: void6 file. add Event Listener( Event. SELECT, onSelected)7 file. add Event Listener(Event. COMPLETE, on Completed)8 file. add Event Listener( Progress Event PROGRESS, on Progress)I interna funcelected(evt: Event): vo id3 state Text"选择了文件"+ file name;interna lfunctionon Comp leted(evt Event): void7{8 state Text"上传完毕!10I l internalfunctionon Progress(evt Progress Event): void3 state Text=L Eft"+Math. round(100*evt bytes Loaded/evt bytes Total)+"%";到这里客户端就只差一步了,那就是完成发起上传请求的方法,实际上就是通过 URLRequest对象创建一个与服务端的连接,然后直接调用 FielReference类的 upload方法就可完成该功能,详细如下代码定义2*调用 File Reference的实例方法 upload实现文件上传interna lfunctionon UpLoadO: void6 if(file size>0)state text="正在上传文件:"+ file namevarrequest: URLRequest=new URLRequest11 request uri"htTp: //localhost/web/upload Handler.ashx12 file upload(request)3}写好了 upload方法,现在就是调用他了,通过按扭的 click事件直接调用就可以,另外调用fie. browse方法则实现选择文件的功能,如下mxm代码描述:I23mx: Button="29"y="llbe"上传文件" width=" 1 11 font Weight=" normal"lick=" on UpLoad">如上便完成了上传文件的Flex客户端开发,通过 file upload方法,将把选择的文件通过二进制的形式发送到指定的服务端,并自动传递一个叫“ filename”的参数,服务端通过 fileName便可以接收到客户端请求上传的文件。

最后我们来看看服务端的 UpLoad Handler. ashx的详细定义Ipublicc lass Upload Handler I Http hAndler3∥件上传目录4 privatestringup load Folder=Up Load6 public voidprocessrequest(htTp contextcontext)context Response Content Type="text/plain10Http filecoLlectionfilEs=context. Request Filesif(files. Count>0)stringpath=context Server MapPath(uploadFolder)Http Posted Filefile=files[o]if(file!=null&&file ContentLength>0)stringsavePath=+""+contextRequestForm["fileName";file Save As(savePath)context Response. Write("参数错误");context Response. Endo29 publicboolls Reusablereturnfalse36}如上一系列的步骤便可完成上传文件的功能,下面便是上传文件示例程序运行截图使用 File Reference上传/下载文件选择了文件做你的爱人m3[选择上传文件使用 File Reference上传/下载文件1n已上传64%进实现了文件上传下面来看看怎么实现文件下载,以上面上传示例中上传的mp3为例,下面我们来看看怎么从服务器(htp:/ loca host/Web/Up Load/做你的爱人mp3)上完成文件(做你的爱人mp3)的下载。

要实现文件下载对服务器端只要保证被下载文件存在就OK,同上传文件一样需要实例化一个 FieIReference对象的实例,并为其添加相应的事件处理函数:privatevarfile Down File reference- new Filereferenceo2* create Children比 creation Comp lete事件更早发生4protectedoverridefunctioncreate Children: vo id6 super create Children;7 file. add Event Listener(Event. SELECT, on Selected)8 file. add Event Listener(Event. COMPLETE, on Completed)9 file. add Event Listener( Progress Event PROGRESS, on Progress10∥实现文件下载11 fileDown addEventlistener(Event. COMPLETE, on Down Completed)12 file Down. add EventListener(Progress Event PROGRESS, on Down Progress)如上为实现下载文件的实例 fileDown注册了成功下载文件后事件处理函数和下载过程处理函数,下面是两个方法的详细定义I internalfunctionon Down Completed(evt: Event): void3 varfileRef: File Reference=evt. current Targetas File Reference4 resultlabel. text="文件名:"+ file Ref, name+"下载完毕!";7internalfunctiononDownProgress(evt: Progress Event): void9 downState. text=E FEX: "+ Math. round( 100*evt bytes Loaded/evt bytes Total)+%"2*调用 File Reference类的实例方法 download实现文件下载4interna lfunctiononDownLoado: vOid6 varrequest: URLRequest=new URLRequestO7 request urf"htTp: //localhost: 1146/upload/1做你的爱人 mp3",8 fleDown download ( request)程序执行到 download()方法的时候会自动弹岀选择保存文件对话框,根据实际情况选择好保存路径就OK下面是实现上传和下载的完整代码实现上传和下载的完整代码123 mx: Button="3l"y="68abel"上传文件" width="l" ont Weight=" normal"lick=" on Up Load"0)83tateText="正在上传文件:"+ file name;varrequest: URLRequest=new URLRequestorequesturl://localhost/web/uploadHandlerash*调用 File reference类的实例方法 download实现文件下载interna lfunctionon DownLoad: voidarrequest: URLRequest=new URLRequestoquest.urf"://localhost/web/upload/1做你的爱人mp丁fileDown. download(request)101
通过这些方式来完成与服务端的通信是非常方便和简单的,但有他的缺点就是通信数据量较小,如要传输大量的数据或是实现不同对象的序列化传输,它们则满足不了我们的需求,需要寻找另外一种通信协议,另一种高效的传输协议来代替SOAP协议传输的方案,那便是AMF( Action ScriptMessage Format)协议开源项目 FluorineFx就是专门针对NET平台与Flx通信提供的AMF协议通信网关,我们可以通过 FlorineF很方便的完成与NET的通信Fluorine官方提供了安装包的下载和在线文档,可以帮助我们有效的利用 Fluor ineFx来开发FluroineFx官方网站:htt:/ww. fluorinefx. luroineFx下载地址:://.fluorinefx./download.htmlFluroine在线文档:htp:.fluorinefx./docs/fluorine/index.htmOK,下面我们来看看使用 FluroineFx通信的NET和Flex配置。

开发环境选择如下NET Microsoft Visual Studio 2008+. NET Framework 3.5Flex: Adobe Flex Builder CS3+ Flex SdK 3.2FluroineFx F luorineFx v10.0.15、NET服务端的开发通过 Microsoft visual studio2008创建创建解决方案,并添加 FluroineFx服务器库,如下图示.NET Framework35回回Visual Studio已安装的模板的 windows窗体应用程序智能没备类库ASP. NET Web应用程序ASP. NET Web服务应用程序wPF应用程序WPF浏览器应用程序控制台应用程序Outlook200外孩程序Workflowwmdw针控件库-其他语言拢的板丁0其他项目类型3.测试项目A project for creating a Florinef enabled service lbrary名称(NFlexDotNet. ServiceLbra位置(「浏荒om匚确定一『取消FluorineFx服务库添加成功后会发现,项目模板会自动为我们创建一个 Sample类和一个Echo方法,如下I namespace FlexDotNet ServiceLibraryFluorinesamp leservice6 [Remoting Service("F luor inesampleservice")7 public class Samplepublic Samplepublic string Echo(string text)eturn"Gatew avecho: +text接着添加 Fluorine Fx网站到解决方案,添加成功后网站会自动引用 Fluorine Fx服务厍的dl如下图添加新网站模板(TNET Framework 3.5Visual studi已安装的板ASP. NET网站感 ASP, NET Web服务楼空网站网 ASP. NET Reports网业ASP.NET Crystal Reports网站我的模板搜索联机模板A project For creating a Fluorine Fx enabled ASP. NET WebSite(. NET Framework 3. 5)位置文件系统F: Demo FlexDotNetiweb浏览()语言():visual C#确定一[取消到这里我们可以简单的测试 FluorineFx的NET服务端是否成功创建。

通过在浏览器中查看 FluroineFx网站中的Console. aspx或是将网站设置为启动项目并设置 Console.aspx为启始页运行网站都可以,程序便会运行到 FluorineFx的控制台,展开左边项目的 Services节点便会看到上面模板为我们创建的类和方法,点击方法节点在右边就可以进行简单的测试了,如下图示Fluorine Fx Console v1.0.0.15a□WebService日命 ServicesOperation: Echoo.OFlexDotNet. ServiceLibraryReturns: Stringa i FlexDotNet. ServiceLbrarya Sample. Echaun Data DomainsResults: Tree:viewRecordset viana taBata Assemblers6 ch三OK,到这里NET的服务器端就开发完成了,这里我们需要记住几点,在接下来的Flex开发中需要根据这些参数来进行配置FluorineFx的NET网站目录: F DemoF lex DotNet webFluorine的NET网站虚拟目录:/WebFluorine的NET网站Url:://locahost:2836/web接受Flex客户端请求的URL:htp/ localhost:2836/ Web/ Gateway. aspx有了上面这些东西配置Flex就简单了,首先创建Flex项目,并将项目路径指向前建立的 Fluor ineFx网站的根路径New Flex ProjectCreate a Flex project.8 You must specify a project lcationProject name: FlexDottProact locationselect Project Locationruse defaut locationFolderproject foleApplicationtypeDemog aneb application oa FlexDotNetO LaResktop applicate4 FlexDotNet. ServiceLibrary口Server technologyApplication server typeOLveeysl Del文件夹新建文件夹□确定取消如上图,将 App lication type设置为 Web app lication, Application Server type设置为: ASPNET,然后Next”。

进入下一个创建项目向导界面,将 Server设置为" USe Internet Information Services(IS)" Web Application root同样指向Fluorine网站的根路径, Web App liation URL则设置为上面我们获取到的路径便OK,详细见下图Fx New Flex ProjectConfigure ASP. NET ServerO The web application root and the URLarServerO Use ASP. NET Developmert Serveromo Use Internet Information Services (Us)Server locationWeb application root: F: DemoFlexDotNet wehExample:locAlhostCompiled Flex application locationThis folder will be inside your project folderQutput folder: bin-debugNext> Nish Cancel按照上面步骤配置好后通过点击“ validate Configuration”进行配置验证,如过验证结果是root and the url are valid.则代表配置正确,可以直接点下一步只到完成项目的创建Flex项目创建完毕,下面在通过一些相应的配置就可以通过 Fluorine和NET通信了。

开发项目属性设置面板,设置其 Flex Compiler为下图所示(- services的配置也可以设置为相对路径)Fx Properties for FlexDotNelbype fiter textlex CompilerFlex SDK versiono Use default SDK (currently Flex 3Flex CompiOUse a specific SDK: Flex?Project Referencesv Copy non-embedded files to output folderun/Debug SettingsY Enable strict type checkingAddtional pler arguments-locseen_LS-services'T:Demo'VFlexDdtNet'wWebEB-NFWextservices-contig xmV Generate HTM wrapper filerEquire Flash Player version:91-0-124V Enable integration wth browser navigationRestore Defauts Applyc「 Cancel设置 Flex server为如下配置,可以点" Validate Location'”验证设置的正确性E Properties for FlexDotNet丁pe filter textG The web root folder and root URL are validBuilderRoot folder:F: Demo'llexDotNetwebFlex ApplicationsFlex Build Pathalidate LocationFlex CompilerFlex ModulesRoot URLttp: Localhost: 2836/NebyomContext root:WebProject ReferencesRun/Debug SettingsDeploy Flex WARRestore Defaults Apply最后设置输出路径就完成了Flex端的配置了国 Properties for FlexDotNetFlex Build pathResource0 rce path=比yp动Flex Bud PathAdditional source folders outside of the main source folderAdd Older,.Flex ModulesProject ReferencesRun/Debug SettingsRemovebrowseOutput folderOutput folder URL[体2806bderCancel到这里Flex端的配置就全部完成,下面我们通过 Fluor ineFx库模板为我们生成的 Sample为例来测试下该环境是否可以通过,在Flex的mxm文件下通过< mx: Remote object>标签来访问远程对象,详细如I这里需要注意的是 destination需要设置为与 i remoting-config xml中的 destinat ion0的致, source则配置为远程对象的全路径(名称空间+类),通过< mx method标签配置远程对象下的方法并设置其成功调用后的结果处理函数,下面便可通过去调用远程方法了。

27
9 ICDATAo1234567internal function on Click: voidervice Echo(txtInput. text)internal function on Result(evt Result Event): void902txtResult text=evt result. toStringmx. Scrip2324mx LabeIx="35"y="95text"结果:">29
木文示例截图ww.测试 Fluorine2122确定结果:eway echo: 2122相关文章:(七):了解 Fluorinefx的环境配置(远程对象、网关通道、目的地)注:本文内容原本计划在上一篇《Flx与NET互操作(六):Flex和NET协同开发利器 FluorineFx》中写出考虑到写在一起文章内容太长故分为两篇Flx中的远程对象访问,也就是服务端提供一个远程服务对象( Remoting Service Object),在Flex客户端通过相应的访问技术去调用远程对象的过程在本系列文章的前面几篇文章中所介绍的访问 Webservice的方法,也就是一种远程对象方法,只不过他是基于WEB服务( WebService)的远程访问,不是基于远程对象( Remoting Object)的的远程访问。

要想直接实现基于对象的远程访问是比较麻烦的,然后 FluorineFx则专门为我们提供了该功能,通过 Fluorine的核心库来开发远程对象( Remoting Object)服务,具体是怎么实现的呢? Fluor ineFx要求为远程对象提供 Remoting Service]标记来提供远程对象服务,看看下面的 Remoting Service Attribute的详细定义I[Attribute Usage( Attribute Targets. Class, Allow Mult ip le=false)]2publicsealedc lass Remoting Serv ice Attribute: Attribute4 public Remoting Service Attributed5 public Remoting Serv iceAttribute(stringserviceName从上一篇文章中的示例代码可以看出,使用NET(c#)定义了一个 Sample的远程对象服务类,并为其指定了Remoting Seryce],详细如下I [Remoting Service("Fluor inesampleserv ice)]2 publicclass Samplebublic Sample6ublicstring Echo(stringtext)C(nreturn"Gatew ayecho: +textI thodname="Echo"result="onResuIt(evocIn. 5 I importmx. rpc events Result Eventinterna lfunctionon Click( voidservice. Echo(txtInput. text)internalfunctionon Result(evt Result Event): voidtxtResult text=evt result. toString14 如上可实现远程对象访问,通过Flex的非可视化组件< mx: RemoteObject>进行远程对象连接。

其中的 source属性指定远程对象,格式为全限定名(命名空间+类名)。

destination属性是非常重要的,这决定了Flex客户端是否可以正确的访问到远对象,相关配置如下destinationid="fluor ine">2345在< mx: RemoteObject>组件内部使用< mx. Mothod>组件配置远程对象中的方法,详细见本文前面部分。

要真实实现远程对象访问的核心是对象的适配器和连接通道:I3 class="flex messaging Services. Remoting Service4 messageTypes="flex messaging. messages. Remoting Message">5 9 default -channels13 *C(n17 18实际开发中我们可以进行自定义通信通道,默认情况下是使用 Fluorine为我们提供的默认连接通道:channel-defin itionid-"my-amf'class="mxmendpointuri://server.name:serverport/contextroot)/gateway.aSpx"class="flex.messagingendpointsAmfEndpoint">true-->8 出处:htp/ ben iao. cnblogs. (八):使用 fluorine网关实现远程访问关于远程访问在本系列文章中陆续的写了不少示例了,本文没有准备深入的去探讨,为了巩固 Fluor inefx网关的学习和使用。

于此,本文将使用 Fluorineⅹ网关来提供数据服务等多项功能来介绍通过 Fluorine实现远程访问的相关知识点Fluorine提供的远程访问包括有很多方面的知道点,本文只介绍其中的三个知识点:访问远程对象返回对象,返回 Datatable,返回 DataSet对象 FluorineFx安装包里自带有相关的示例程序,要学习更多可直接参考这些示例程序在实现访问前我们同样来做一些准备工作,建立好远程对象,如下Namespace Fluorine. ServiceLibrary3 publicclass Bookpublicstring Namefget; set6789oublicstring Author get; set;publicdoublePrice(get; set;下面是提供Flex访问的远程对象I namespace Fluorine. ServiceLibrary3 [Remoting Service4 publicclass FluorineService//∥/返回 DataSet对象∥/ summary>[DataSet Type(Fluorine. ServiceLibrary. Book)public Data Set GetDataSetODataSet("DS");DataTabledtds. Tables. Add("Books")dt Columns. Add("Name", typeof(string)dt Columns. Add("Price", typeof(double))DataRowdr=dt. New Row O;frinmmdt Rows. Add( dr)drl"ld=2dr[Name"="《西游记》dr" Author"="吴承恩"dt Rows. Add( dr)81上面代码片段中分别提供了返回一个对象, DataTable, DataSet对象的方法。

这里只需要记住两个关键标识就行它门是: Data Table Type和 DataSetType.下面通过Fex的非可视化组件< mx RemoteObject>来访问远程对象,OK,下面我们来看看具体怎么来调用1source="Fluorine. ServiceLibrary Fluorine Service3 fault="on Fault Handler(event4 5 6 >7/mx: RemoteObject>返回对象示例I Unable]privatevarbook Book vo;4privatefunctionon Get Book Handler(evt: ResuIt Event): void6 book=evt resultas book vo通过点击按扭调用远程方法 Get Book(完成方法的调用,直接可以将返回结果绑定到界面元素上。

I2返回 DataTable对象返回 DataTable和 DataSet,将结果绑定到 DataGrid上显示,先看看 Data Grid的定义:12 mx: DataGrid Columnheader Text=4 y"dataField="Id"/>7 23 35 6
下面转到客户端的开发,建立Fex项目并设计好界面,如下图Fiuorinefx net视频录制和回放(htp:// beniao cnblogs con)连接到国忿录制视频停止录制视回建立与 Fluorine服务器上应用程序的连接,连接成功则将自己的视频数据显示到界面上,如下实现代码:private function connection Server(event: Mouse Event): voidnew NetConnectiononcconnect(rtmp: //localhost: 1617/VideoRecord,ben iao, 123456);ncaddEventListener(Net Status Event. NET STATUS, onNet Stauts Handler)clientprivate function onNetStauts Hand ler(event: NetStatus Event): void丁if(event. info. codeetConnection. Connect Success")cam Camera. getCameraohis. my vidadmin. elseAler. yes Label="确定";Alert. show("没有检测到视频摄像头""系统提示")录制视频也就是将自己本杋的视频摄像头获取的视频数据以及音频设备的数据附加到网络流(NeSτream,使用网络流的 publish方法将流发布到服务器上,这和使用FMS是相同的。

private function on Record video(event: Mouse Event): voidvar mic: Microphoneicrophone. getMicrophonew Net Stream(this ncattach Camera(cam)sattach Audio(mic)ns.client thisns publish(this. videoName. text, record")this btn Start enabledhis. btn End enabledtrueprivate function onStopRecord(event: MouseEvent): voidthis btn Play enabledtrue,停止视频录制的功能就更加简单了,直接断开当前客户端与服务器端的连接就可以,使用网络连接( NetConnection)的 close方法。

Fluorine.NET视频录制和回放(://beniao.cnblogs.连接到服务器test0001丁录制视频w录制好的视频将会保存在网站下的apps/ Video App/stream目录中,如下图址|DFuNETFx, Web apps Vi deoAppstreams比est0001,且v视频任务L文件D全部播放丛扫描仪或照相机获取实现录制的视频回放实际上就是播放服务器上的一个视频文件,同样需要先建立与服务器端的网络连接,通过网络流去加载指定的视频文件,最后将其显示到应用界面上private function onPlay video(event: Mouse Event): voidw Net Connectionnc connect("rtmp: //localhost: 1617/VideoRecord","ben iao, 123456)nc. add EventListener(NetStatus Event. NET STATUS, on Play Net Stauts Handler)nc. clientprivate function on Play NetStauts Hand ler(event: Net Status Event): voidif(event. info. codeNetConnection Connect Success")ns= new Net Stream(this nc );ns.clientnew Videovideo. height240:this. my Video. add Child( video)this ns. play(this video Name, text)到此就完成了使用 Fluor ineFx Net来实现视频录制和回放的功能,接下来我们来看看 Fluor ineFx对发布录制视频流以及实况视频流的安全方面是怎么处理的。

FhuorineFx. Messaging Api. Stream. IStreamPublishSecurity接口就是专门用来处理发布流是的安全处理的,如果要对发布流进行安全方面的处理,那么就自定义一个实现该接口的安全策略类,在策略类里根据自己的实际情况来处理安全设置通过该安全策略类可以很方便的判断发布流的类型、流的名称以及对发布流进行授权等相关操作。

如下安全策略类:namespace Fx Adapterpublic class PublishSecurity IStreamPublishSecuritypublic bool Is PublishAllowed(IScope scope, string name, string mode)/是否为录制流W(record". Equals(mode)tocIn. return false∥文件名是否以test开头if (name Starts With(test))return truo在应用处理程序里通过 App lication Adapter提供的 Register Stream PublishSecurityo方法注册安全策略,该方法的定义如下所示public void Register StreamPublish Security(IStream PublishSecurity handler)要注册发布流的安全策略,通常都是在应用程序启动中注册,如下代码块:public override bool AppStart(IScope application)Register Stream PublishSecurity(new Publish Security;通过 Register StreamPublishSecurityo方法注册好发布流的安全策略后,每次发布流都会通过自定义的安全策略来检测当前发布流是否符合自定义的安全规则。

这样一方便可以保证别人恶意连接到你的应用程序进行流的发布消耗网络带宽等多中不利现象,更多的好处还待研究。

文章出处:htp:/benjac.cnblogs.(十五):使用 FluorineFx中的字节数组( ByteArray)实现图片上传前几天一位朋友问我一个问题,他说:“我用HTTP接口或是WebService接口可以实现图片上传功能,那么用Fluorine如何实现图片上传功能呢?”,其实仔细看官方文档和示例程序的自已都可以找到答案,实现上传可以有很多种实现,这里我以官方所提供是示例为基础稍加改动,通过 Byte Array类实现图片上传首先建立 FluorineFx库和网站,在远程服务器类里添加一个处理文件上传的方法,详细代码如下namespace ByteStream. Services[Remoting Servicebublic class Byte StreamServicepublic Byte Array UploadImage( Byte Array ba)Memory Stream ms= new MemoryStream(ba. Get BufferO)mage img= Bitmap. FromStream(ms)丁Bitmap new Image= new Bitmap(imgMemory Stream tempStream= new MemoryStreamnew Image Save(tempStream, System. Draw ing Imaging Image Format. Png)stringpath=context.CurrentServerMappath(uploAd/byteArray.png)FileStream fs=new FileStream(path, FileMode Create)temp Stream. Write To( fsByte Array result=new Byte Array(tempStream)return result处理图片上传的方法通过把fex客户端传递来的字节数组包装为内存流,然后通过写文件的形式将图片保存到指定的目录下。

示例中提供了一个画图板,用户可以通过选择颜色自画不同的图象,然后保存到服务器上指定的目录。

画图板的实现是根据鼠标按下的移动路线做的,代码如下:te function doMouseDowno: voidxl= my Canvas. mouseXyI= my Canvas. mouseY;is Drawing=true,private function doMouse Move(): voidx2=my Canvas mouseX;y2= my Canvas mouseY,if(is ing)my Canvas. graphics. line Style(2, draw Color)my Canvas. graphics. moveTo(xl, y1)my Canvas. graphics. line To( 2, y2);private function doMouseUpo: voidis Draw ing= false清空画图板private function on Erase(event: Mouse Event) voidmy Canvas. graphics. c learO在官方实例中是使用的 RemoteObject实现的,这里我将其修改为通过编程实现AMF通信实现当程序初始化private var nc: NetConnection;private var rs: Responder;private function init(: voidC(nrs=new Responder(onResult, on Fault)nc=new NetConnectiononc.connect(://localhost:2453/fluorinefxWeb/gateway.aspx")lient thCO在Flex客户端通过当前网络连接的calo方法实现远程方法调用,并指定通过 Responder来处理服务器端方法的返回结果。

private function onSavelmage(event: Mouse Event): vo idvar bd: Bitmap Data=new Bitmap Data( my Canvas width, my Canvas. height)bd draw(my Canvas)var ba: Byte Array new PNGEncodero encode(bdnc.call("ByteStream. Services. Byte Stream Service. UploadImage", rs, ba);提示在进行Flx开发中,能够通过编程实现的最好通过编程实现,尽量少的去使用Fex组件这样可以有效的给Flex程序瘦身服务器端将传递过去的 ByteArray数据返回到了客户端,客户端接收到这些数据通过处理将字节数组转化为显小对象后显示到界面上。

private function on Result(result: Byte Array): voidnewloader contentLoaderInfo. add EventListener( Event. COMPLETE, loader Comp lete Handler)loader load Bytes(result);private function loader Comp lete Hand ler(event: Event): vo idvar loader: Loader=(event. target as LoaderInfo) loaderloader, contentLoaderInfo. remove EventListener(Event. COMPLETE, loader Complete Hand ler);var pictureHolder: UIComponent new UIComponent(picture Holder. add Child (loader)this resultImage. width= my Canvas. widththis resultImage add Child(picture Ho lder)private function on Fault(event: Object): void到此就完成了图片上传功能,下面是完整的Flex客户端代码:Flx端完整代码[CDATALimport mxcore UIComponentimport mimport mx events. ResizeEventimport mx graphics. codec. PNGEncoderimport mx rpc events. Fault Event丁import mx rpc events. ResultEventprivate var is Draw ing: Boolean=falseWV prne a m ocin. private var draw Color: uintprivate var nc: Net Connectionprivate var rs: Responderprivate function initO: voidrs=new Responder(onResult, on Fault)nc=new Net Connectionnc.connect(://localhost:2453/fluorinefxWeb/gateway.aspx")nc client= thisprivate function onSavelmage(event: MouseEvent): vo idvar bd: Bitmap Data=new Bitmap Data( my Canvas width, my Canvas. height)bd draw(my Canvas)var ba: Byte Array= new PNGEncoderO encode(bd)nc.call"Byte Stream. Services. Byte StreamService UploadImage",rs, ba)private function onResult(result: Byte Array): voidvar loader: Loader= new Loaderloader contentLoaderInfo. add Event L istener( Event. COMPLETE, loader Comp lete Hand ler)loader load Bytes(result)private function loader Comp lete Handler(event: Event): voidvar loader: Loader=(event. target as LoaderInfo) loaderloader contentLoaderInfo. remove Event Listener(Event. COMPLETE, loader Complete Handler)var picture Holder: UIComponent= new UIComponentopictureHolder. add Child( loader)this resultImage. w idth my Canvas, widthge. add Child(pictureHlolder)private function on Fault(event: Object): VOprivate func tion doMouseDowno: voidprivate function doMouseMoveO: void2= my Canvas. mouseYif (isDmy Canvas. graphics. line Style(2, draw Color)my Canvas. graphics. moveTo(xl, y1)private function doMouseUpo: voidfals/清空画图板private function on Erase(event: Mouse Event): voidmy Canvas. graphics. clear0"y=10" width=348 heiom■除保存图片看不清楚?请点击这甲查看原图(大图)。

出处://beniaocnblogs.。