LearningFMS3中文版第4章(1)共享对象

By:www.hcxmflash.cn Date:2009-04-26

4.1. 在多个连接上共享数据

当我第一次遇到远程共享对象时,我想,至发明浏览器以来,它已成为互联网的最重要的贡献。多年来看法几乎没有变化,特别是任何应用程序,在一个“live”的情况需要传送数据与其它结合的时候。

因此,什么是共享对?它们是什么用来做什么的呢?共享对象是可以显示和在一个浏览器上控制的, 和在另一个上可以看到。因此,如果你有一个应用程序使用文字输入栏来显示文本,您可以显示该文本在您自己的浏览器,以及在所有其他人的浏览器上都可以在相 同的应用程序上看到。除了文字,你可以在一个屏幕上移动影片剪辑,它们也会在其他屏幕上移动。您可以点击一个在浏览器上的按惯,来开启一个在所有的浏览器 使用共享对象的事件。

当一个共享对象是设立在一个FMS3的应用程序,它建立了一个“subscription”,其它 人如果运行了相同的应用程序的话会自动订阅它。把共享对象想像为杂志,大家从该杂志获得订阅。 “杂志”以实时数据的形式发布。因此,如果您正在发送一个文本字段中的文本的话,一旦您输入数据,在远程计算机上就可以看到了。

4.1.1.持久和非持久共享对像

非持久共享对象是可以想像成变量。当您退出一个应用程序,所有变量中的值会消失。他们不会继续存在。同样地,一旦用户离开应用程序,一个在非持久共享对象中的数据会丢失。

持久的共享对象是更像是数据库中的数据。持久共享对象的数据是存储在服务器的硬盘上,因此,持 久。当您需要从不同的地方来访问你的数据,持久共享对象是非常的方便。不过,这章只涉及非持久共享对象。在第八章,会讨论更多高级的共享对象的概念,以及 研究服务器端和持久共享对象。

4.1.2. 利用非持久远程共享对像

而任何非持久远程共享对象将远远低于其可能的用途,以下列出你可以使用的想法:

  • 远程控制幻灯片放映
  • 文字聊天
  • 网络对战
  • DJ应用程序,远程选择和播放歌曲
  • A doorbell.门铃?
  • 现场拍卖
  • 客户服务应用程序

记住这些应用程序,让我们看看如何使用FMS3 创建和使用共享对象。

 

4.2.实例化远程共享对像

这一章将以最少的代码来展示三种不同的远程共享对象。首先是一个指示器,可以在其 它人的网页里,把它指向任何位置。这种指针可以派上用场,如果您对一个偏远的位置做出展示,你必须给观众指示不同的事情。第二,您会看到如何使最低限度的 代码来制作文本聊天,一个输入文本框中输入的文本,会在所有用户的屏幕上显示出来。第三,使用一个共享影片剪辑,您会看到如何在远程观众的屏幕上打开一个 web页面。这些都是微不足道的例子,但他们显示出你可以使用远程共享对象来做不同的事情。其余的就要看你的想象力了。

当声音一个变量时,你可以声明它的类型:

private var so:SharedObject;

通用实例化一个共享对像的格式,如图4-1:

图4-1. Instantiating SharedObject class

clip_image002

 

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” 表示客户端更改了共享对象

这个应用程序的目的是:帮助你了解关于共享对像是怎么工作的一些东西,但由于设计,它着重于处理的步骤和如何改变共享对像中的值。暂时这并不共享任何远端。以下步骤显示了如何设置它:

  1. 建立一个BasicSO.fla
  2. 在文档类中输入BasicSO
  3. 建立一个BasicSO.as文件
  4. 在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);

}

}

}

  1. 测试影片

运行例子后,在输出窗口中会显示:

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)语句,和以 往一样都不要忘记把它包含在您的应用程序中。(当您调试您的代码,通常你会发现,共享对象连接已经离开了,没有它,您的共享对象,将不能正确运行)。

 

 

参与讨论去: 艾睿(Airia) 交朋友去:友吧推荐文章去:网站贴吧
企业招聘

北京中视力天文化传媒有限公司

公司简介:北京中视力天文化传媒有限公司,是CCTV.com央视国际网络有限公司投资的互联网研发团队。我们是天使的使者。。。

招聘FlashAS程序员详情点击

Copyright 2007-2008 51AS.com Extended in kingcms 鲁ICP备06001158号