`
op380op
  • 浏览: 15484 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Learning Flash Media Server 3中文版-第4章之2/6

 
阅读更多

Learning Flash Media Server 3中文版-第4章之2/6
2009年08月19日
  4.2.实例化远程共享对像 这一章将以最少的代码来展示三种不同的远程共享对象。首先是一个指示器,可以在其它人的网页里,把它指向任何位置。这种指针可以派上用场,如果您对一个偏远的位置做出展示,你必须给观众指示不同的事情。第二,您会看到如何使最低限度的代码来制作文本聊天,一个输入文本框中输入的文本,会在所有用户的屏幕上显示出来。第三,使用一个共享影片剪辑,您会看到如何在远程观众的屏幕上打开一个web页面。这些都是微不足道的例子,但他们显示出你可以使用远程共享对象来做不同的事情。其余的就要看你的想象力了。 当声音一个变量时,你可以声明它的类型:
  private var so:SharedObject;
  
通用实例化一个共享对像的格式,如图4-1: 图4-1. Instantiating SharedObject class 
  
   getRemote(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.设立共享对象存储:插槽 当你设置了一个共享对像实例,你需要基于共享对像的属性上设置一个存储系统。不同于早期版本的Flash Communication Server和Flash Media Server,Flash Media Server 3使用SharedObject.setProperty()方法来赋值到一个共享对象的属性。在分配不同的共享对象属性,您可以使用各种数据类型来创建插槽。以下显示一个简单的属性插槽:
  var memberName:String= name_txt.text;
  so.setProperty(”cliName”, memberName);
共享对象有一个data属性:cliname 。所以现在有一个字符名称存储槽,可与连接到相同应用程序的其他人共享。同样地,作为您的应用需求,您可以设定许多插槽,使用适当的数据类型作为存储的数据。每当共享对象的属性发生变化,会触发一个SyncEvent,要使用一个事件处理程序,来为所有连接到同一个共享对像上的连接更新资料,。 4.2.2. Inspecting a Shared Object检查一个共享对像 为了更好地了解一个共享对象是怎么回事,看看它的内容。它应该会出现类似的内容,一个数组或任何对象,已超过一个单一的元素。添加一个文件夹到您的服务器端,文件夹命名为basicso ; 在这一章中,此文件夹将被用于所有的例子。在下面的例子中,几个不同类型的数据都被添加到插槽。属性包括字面以及变量,以说明可以放进共享对象数据的范围。 4.2.2.1. SyncEvent 当您使用远程共享的对象被其他客户使用,一个重要的类就是SyncEvent 。顾名思义,这个事件使用在同步事件中,在您的浏览器上和那些在其他浏览器上使用相同的远程共享对象。通过使用SYNC常数,一旦客户端连接到一个远程共享对象,一个同步事件发生。每当一个客户端改变了一个共享对象的data属性,会调用一个同步事件。但是,由于各种不同的动作关联到共享对象产生的事件,您需要一种方法,以确定事件的种类。 4.2.2.2. changeList属性 在ActionScript 3.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文件中输入以下代码: Example 4-1. BasicSO.as
  Code View: package { import flash.display.Sprite; import flash.net.SharedObject; import flash.events.NetStatusEvent; import flash.events.SyncEvent; import flash.net.NetConnection; //import flash.net.ObjectEncoding; public class BasicSO extends Sprite { private var test_so:SharedObject; private var nc:NetConnection; private var monthDay:Date; private var good:Boolean; public function BasicSO () { //NetConnection.defaultObjectEncoding=flash.net.ObjectEncoding.AMF0; //Connect var rtmpNow:String=”rtmp://192.168.0.11/basicSO”; nc=new NetConnection; nc.connect (rtmpNow); nc.addEventListener (NetStatusEvent.NET_STATUS,doSO); } private function doSO (e:NetStatusEvent):void { good=e.info.code == “NetConnection.Connect.Success”; if (good) { //Set up shared object test_so=SharedObject.getRemote(”test”,nc.uri,false); monthDay=new Date; test_so.connect (nc); test_so.addEventListener (SyncEvent.SYNC,seeSO); } } private function seeSO (se:SyncEvent):void { trace (se.changeList[0].code); switch (se.changeList[0].code) { case “clear” : loadSO (); break; case “success” : showSO (); break; } } private function loadSO ():void { test_so.setProperty (”city”,”Katmandu”); test_so.setProperty (”dayOfMonth”,monthDay.getDate()); test_so.setProperty (”verity”,true); test_so.setProperty (”bunch”,250); } private function showSO ():void { trace (test_so.data.city); trace (test_so.data.dayOfMonth); trace (test_so.data.verity); trace (test_so.data.bunch); } } }
  
测试影片 运行例子后,在输出窗口中会显示:
  clear success Katmandu 15 true 250
  
你可以看到,共享对象在ActionScript中具有基本数据类型与其他变量与属性一样,像其它对像和变量一样可以提取。 4.2.3.同步的共享对像 每当任何共享对象的属性,或“插槽”改变,这种改变一定会广播给所有这些连接。处理这一事件的程序是SyncEvent.SYNC ,回调。每一次任何数据属性的变化,一个改变事件会触发SyncEvent.SYNC,用这种方式回调,,在所有的连接中,所有改变的属性会被更新。一般格式是如下:
  share_so.addEventListener (SyncEvent.SYNC,syncSO); …. private function syncSO(event: SyncEvent) { //用so.data的属性的值来更新变量 variable1= my_so.data.attribute1; variable2= my_so.data.attribute2; variable3= my_so.data.attribute3; }
  
这种变化的过程中相当简单。在脚本中的某处,某个用户改变了在共享对像data属性中的一个插槽。一旦属性被改变,触发SyncEvent.SYNC ,回调;和在此情况下,SyncEvent.SYNC ,回调容器中的代码,更新改变遍及应用程序中的连接。 为在整个过程中正常运作,你需要连接共享对象和服务器, SharedObject. Connect(NetConnection)。为了能够与远程共享对象工作的有意义,您将需要一条线连接共享对象,例如,以FMS3使用NetConnection实例作为一个参数。例如: billz_so.connect(nc); 作出必要的连接共享对象,例如billz_so发送和接收共享对象的变化,使用Netconnection实例nc。这本章中的所有例子,注意力在SharedObject.connect(NetConnection)语句,和以往一样都不要忘记把它包含在您的应用程序中。(当您调试您的代码,通常你会发现,共享对象连接已经离开了,没有它,您的共享对象,将不能正确运行)。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics