4.1. 在多个连接上共享数据
当我第一次遇到远程共享对象时,我想,至发明浏览器以来,它已成为互联网的最重要的贡献。多年来看法几乎没有变化,特别是任何应用程序,在一个“live”的情况需要传送数据与其它结合的时候。
因此,什么是共享对?它们是什么用来做什么的呢?共享对象是可以显示和在一个浏览器上控制的, 和在另一个上可以看到。因此,如果你有一个应用程序使用文字输入栏来显示文本,您可以显示该文本在您自己的浏览器,以及在所有其他人的浏览器上都可以在相 同的应用程序上看到。除了文字,你可以在一个屏幕上移动影片剪辑,它们也会在其他屏幕上移动。您可以点击一个在浏览器上的按惯,来开启一个在所有的浏览器 使用共享对象的事件。
当一个共享对象是设立在一个FMS3的应用程序,它建立了一个“subscription”,其它 人如果运行了相同的应用程序的话会自动订阅它。把共享对象想像为杂志,大家从该杂志获得订阅。 “杂志”以实时数据的形式发布。因此,如果您正在发送一个文本字段中的文本的话,一旦您输入数据,在远程计算机上就可以看到了。
4.1.1.持久和非持久共享对像
非持久共享对象是可以想像成变量。当您退出一个应用程序,所有变量中的值会消失。他们不会继续存在。同样地,一旦用户离开应用程序,一个在非持久共享对象中的数据会丢失。
持久的共享对象是更像是数据库中的数据。持久共享对象的数据是存储在服务器的硬盘上,因此,持 久。当您需要从不同的地方来访问你的数据,持久共享对象是非常的方便。不过,这章只涉及非持久共享对象。在第八章,会讨论更多高级的共享对象的概念,以及 研究服务器端和持久共享对象。
4.1.2. 利用非持久远程共享对像
而任何非持久远程共享对象将远远低于其可能的用途,以下列出你可以使用的想法:
记住这些应用程序,让我们看看如何使用FMS3 创建和使用共享对象。
4.2.实例化远程共享对像
这一章将以最少的代码来展示三种不同的远程共享对象。首先是一个指示器,可以在其 它人的网页里,把它指向任何位置。这种指针可以派上用场,如果您对一个偏远的位置做出展示,你必须给观众指示不同的事情。第二,您会看到如何使最低限度的 代码来制作文本聊天,一个输入文本框中输入的文本,会在所有用户的屏幕上显示出来。第三,使用一个共享影片剪辑,您会看到如何在远程观众的屏幕上打开一个 web页面。这些都是微不足道的例子,但他们显示出你可以使用远程共享对象来做不同的事情。其余的就要看你的想象力了。
当声音一个变量时,你可以声明它的类型:
private var so:SharedObject;
图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);
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()出来看看:
这个应用程序的目的是:帮助你了解关于共享对像是怎么工作的一些东西,但由于设计,它着重于处理的步骤和如何改变共享对像中的值。暂时这并不共享任何远端。以下步骤显示了如何设置它:
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)语句,和以 往一样都不要忘记把它包含在您的应用程序中。(当您调试您的代码,通常你会发现,共享对象连接已经离开了,没有它,您的共享对象,将不能正确运行)。
Copyright 2007-2008 51AS.com Extended in kingcms 鲁ICP备06001158号