4.1.在多个连接上共享数据当我第一次遇到远程共享对象时,我想,至发明浏览器以来,它已成为互联网的最重要的贡献。多年来看法几乎没有变化,特别是任何应用程序,在一个“live”的情况需要传送数据与其它结合的时候。因此,什么是共享对?它们是什么用来做什么的呢?共享对象是可以显示和在一个浏览器上控制的,和在另一个上可以看到。因此,如果你有一个应用程序使用文字输入栏来显示文本,您可以显示该文本在您自己的浏览器,以及在所有其他人的浏览器上都可以在相同的应用程序上看到。除了文字,你可以在一个屏幕上移动影片剪辑,它们也会在其他屏幕上移动。您可以点击一个在浏览器上的按惯,来开启一个在所有的浏览器使用共享对象的事件。当一个共享对象是设立在一个FMS3的应用程序,它建立了一个“subscription”,其它人如果运行了相同的应用程序的话会自动订阅它。把共享对象想像为杂志,大家从该杂志获得订阅。“杂志”以实时数据的形式发布。因此,如果您正在发送一个文本字段中的文本的话,一旦您输入数据,在远程计算机上就可以看到了。4.1.1.持久和非持久共享对像非持久共享对象是可以想像成变量。当您退出一个应用程序,所有变量中的值会消失。他们不会继续存在。同样地,一旦用户离开应用程序,一个在非持久共享对象中的数据会丢失。持久的共享对象是更像是数据库中的数据。持久共享对象的数据是存储在服务器的硬盘上,因此,持久。当您需要从不同的地方来访问你的数据,持久共享对象是非常的方便。不过,这章只涉及非持久共享对象。在第八章,会讨论更多高级的共享对象的概念,以及研究服务器端和持久共享对象。4.1.2.利用非持久远程共享对像而任何非持久远程共享对象将远远低于其可能的用途,以下列出你可以使用的想法:远程控制幻灯片放映文字聊天网络对战DJ应用程序,远程选择和播放歌曲Adoorbell.门铃?现场拍卖客户服务应用程序记住这些应用程序,让我们看看如何使用FMS3创建和使用共享对象。4.2.实例化远程共享对像这一章将以最少的代码来展示三种不同的远程共享对象。首先是一个指示器,可以在其它人的网页里,把它指向任何位置。这种指针可以派上用场,如果您对一个偏远的位置做出展示,你必须给观众指示不同的事情。第二,您会看到如何使最低限度的代码来制作文本聊天,一个输入文本框中输入的文本,会在所有用户的屏幕上显示出来。第三,使用一个共享影片剪辑,您会看到如何在远程观众的屏幕上打开一个web页面。这些都是微不足道的例子,但他们显示出你可以使用远程共享对象来做不同的事情。其余的就要看你的想象力了。当声音一个变量时,你可以声明它的类型:privatevarso:SharedObject;通用实例化一个共享对像的格式,如图4-1:图4-1.InstantiatingSharedObjectclassgetRemote(name:String,remotePath:String=null,persistence:Object=false,secure:Boolean=false):SharedObject如果尚不存在共享对象,则此方法将创建一个共享对象。你可以使用getLocal()方法建立一个本地共享对像。本书中没有使用本地共享对像的例子。name:String—对象的名称。该名称可以包含正斜杠(/);例如,work/addresses是合法名称。共享对象名称中不允许使用空格,也不允许使用以下字符:~%&\;:”‘,??#remotePath:String(default=null)—将存储共享对象的服务器的URI。此URI必须与传递给SharedObject.connect()方法的NetConnection对象的URI相同。persistence:Object(default=false)—指定共享对象的数据属性的特性是本地永久储存还是远程永久储存,或者是同时进行本地永久储存和远程永久储存。此参数还可指定共享对象的本地存储位置。可接受的值包括:false,指定客户端或服务器上的共享对象不是永久性的。true,指定只有服务器上的共享对象是永久性的。共享对象的完整路径或部分路径,指定客户端和服务器上的共享对象都是永久性的。客户端的共享对象存储在指定路径中,而服务器中的共享对象则存储在应用程序目录中的子目录内。4.2.1.设立共享对象存储:插槽当你设置了一个共享对像实例,你需要基于共享对像的属性上设置一个存储系统。不同于早期版本的FlashCommunicationServer和FlashMediaServer,FlashMediaServer3使用SharedObject.setProperty()方法来赋值到一个共享对象的属性。在分配不同的共享对象属性,您可以使用各种数据类型来创建插槽。以下显示一个简单的属性插槽:varmemberName:String=name_txt.text;so.setProperty(”cliName”,memberName);共享对象有一个data属性:cliname。所以现在有一个字符名称存储槽,可与连接到相同应用程序的其他人共享。同样地,作为您的应用需求,您可以设定许多插槽,使用适当的数据类型作为存储的数据。每当共享对象的属性发生变化,会触发一个SyncEvent,要使用一个事件处理程序,来为所有连接到同一个共享对像上的连接更新资料,。4.2.2.InspectingaSharedObject检查一个共享对像为了更好地了解一个共享对象是怎么回事,看看它的内容。它应该会出现类似的内容,一个数组或任何对象,已超过一个单一的元素。添加一个文件夹到您的服务器端,文件夹命名为basicso;在这一章中,此文件夹将被用于所有的例子。在下面的例子中,几个不同类型的数据都被添加到插槽。属性包括字面以及变量,以说明可以放进共享对象数据的范围。4.2.2.1.SyncEvent类当您使用远程共享的对象被其他客户使用,一个重要的类就是SyncEvent。顾名思义,这个事件使用在同步事件中,在您的浏览器上和那些在其他浏览器上使用相同的远程共享对象。通过使用SYNC常数,一旦客户端连接到一个远程共享对象,一个同步事件发生。每当一个客户端改变了一个共享对象的data属性,会调用一个同步事件。但是,由于各种不同的动作关联到共享对象产生的事件,您需要一种方法,以确定事件的种类。4.2.2.2.changeList属性在ActionScript3.0的,其中一个关键的属性,在成功地处理共享对像有关动作所产生的事件,是SyncEvent.changeList属性。该changeList属性是一个存储共享对象属性的数组。changeList属性的一个关键属性code:指示什么类型的事件发生。当第一次连接到一个共享对象,code会生成一个code值“clear”。此code值可以用来帮助,跟踪连接到同一个共享对象的用户的数量。当一个远程用户的改变了共享对象的值,会产生两个code事件。一个“success”值表示客户成功改变值。一个“change”值表明别人改变了共享对象。因此,当客户端改变了,他会接收到”success”代码,以及其他任何连接到同一个共享对象的客户端都会接收到“success”代码值。对于第一个例子,无论是“clear”和“success”状态,都直接用来创造插槽,并指派值给共享对像,然后用来显示这些插槽的内容。为了看看所有这些是怎么工作的,你可以在下面一个应用程序中trace()出来看看:在BasicSO构造函数中添加一个NetConnection。它会产生一个NetStatusEvent事件在doSO函数中建立一个共享对像,把共享对像连接到NetConnection实例,产生一个sync事件在seeSo函数中,使用SyncEvent确定事件的类型。它使用在changelist属性数组的零元素。一发现“clear”,表示您已成功连接到共享对象,并调用函数来设置共享对象属性。如果它发现“success”表示客户端更改了共享对象这个应用程序的目的是:帮助你了解关于共享对像是怎么工作的一些东西,但由于设计,它着重于处理的步骤和如何改变共享对像中的值。暂时这并不共享任何远端。以下步骤显示了如何设置它:建立一个BasicSO.fla在文档类中输入BasicSO建立一个BasicSO.as文件在BasicSO.as文件中输入以下代码:Example4-1.BasicSO.asCodeView:package{importflash.display.Sprite;importflash.net.SharedObject;importflash.events.NetStatusEvent;importflash.events.SyncEvent;importflash.net.NetConnection;//importflash.net.ObjectEncoding;publicclassBasicSOextendsSprite{privatevartest_so:SharedObject;privatevarnc:NetConnection;privatevarmonthDay:Date;privatevargood:Boolean;publicfunctionBasicSO(){//NetConnection.defaultObjectEncoding=flash.net.ObjectEncoding.AMF0;//ConnectvarrtmpNow:String=”rtmp://192.168.0.11/basicSO”;nc=newNetConnection;nc.connect(rtmpNow);nc.addEventListener(NetStatusEvent.NET_STATUS,doSO);}privatefunctiondoSO(e:NetStatusEvent):void{good=e.info.code==“NetConnection.Connect.Success”;if(good){//Setupsharedobjecttest_so=SharedObject.getRemote(”test”,nc.uri,false);monthDay=newDate;test_so.connect(nc);test_so.addEventListener(SyncEvent.SYNC,seeSO);}}privatefunctionseeSO(se:SyncEvent):void{trace(se.changeList[0].code);switch(se.changeList[0].code){case“clear”:loadSO();break;case“success”:showSO();break;}}privatefunctionloadSO():void{test_so.setProperty(”city”,”Katmandu”);test_so.setProperty(”dayOfMonth”,monthDay.getDate());test_so.setProperty(”verity”,true);test_so.setProperty(”bunch”,250);}privatefunctionshowSO():void{trace(test_so.data.city);trace(test_so.data.dayOfMonth);trace(test_so.data.verity);trace(test_so.data.bunch);}}}测试影片运行例子后,在输出窗口中会显示:clearsuccessKatmandu15true250你可以看到,共享对象在ActionScript中具有基本数据类型与其他变量与属性一样,像其它对像和变量一样可以提取。4.2.3.同步的共享对像每当任何共享对象的属性,或“插槽”改变,这种改变一定会广