FMS3技术文档之四.docx
《FMS3技术文档之四.docx》由会员分享,可在线阅读,更多相关《FMS3技术文档之四.docx(30页珍藏版)》请在冰豆网上搜索。
FMS3技术文档之四
4.1.在多个连接上共享数据
当我第一次遇到远程共享对象时,我想,至发明浏览器以来,它已成为互联网的最重要的贡献。
多年来看法几乎没有变化,特别是任何应用程序,在一个“live”的情况需要传送数据与其它结合的时候。
因此,什么是共享对?
它们是什么用来做什么的呢?
共享对象是可以显示和在一个浏览器上控制的,和在另一个上可以看到。
因此,如果你有一个应用程序使用文字输入栏来显示文本,您可以显示该文本在您自己的浏览器,以及在所有其他人的浏览器上都可以在相同的应用程序上看到。
除了文字,你可以在一个屏幕上移动影片剪辑,它们也会在其他屏幕上移动。
您可以点击一个在浏览器上的按惯,来开启一个在所有的浏览器使用共享对象的事件。
当一个共享对象是设立在一个FMS3的应用程序,它建立了一个“subscription”,其它人如果运行了相同的应用程序的话会自动订阅它。
把共享对象想像为杂志,大家从该杂志获得订阅。
“杂志”以实时数据的形式发布。
因此,如果您正在发送一个文本字段中的文本的话,一旦您输入数据,在远程计算机上就可以看到了。
4.1.1.持久和非持久共享对像
非持久共享对象是可以想像成变量。
当您退出一个应用程序,所有变量中的值会消失。
他们不会继续存在。
同样地,一旦用户离开应用程序,一个在非持久共享对象中的数据会丢失。
持久的共享对象是更像是数据库中的数据。
持久共享对象的数据是存储在服务器的硬盘上,因此,持久。
当您需要从不同的地方来访问你的数据,持久共享对象是非常的方便。
不过,这章只涉及非持久共享对象。
在第八章,会讨论更多高级的共享对象的概念,以及研究服务器端和持久共享对象。
4.1.2.利用非持久远程共享对像
而任何非持久远程共享对象将远远低于其可能的用途,以下列出你可以使用的想法:
∙远程控制幻灯片放映
∙文字聊天
∙网络对战
∙DJ应用程序,远程选择和播放歌曲
∙Adoorbell.门铃?
∙现场拍卖
∙客户服务应用程序
记住这些应用程序,让我们看看如何使用FMS3创建和使用共享对象。
4.2.实例化远程共享对像
这一章将以最少的代码来展示三种不同的远程共享对象。
首先是一个指示器,可以在其它人的网页里,把它指向任何位置。
这种指针可以派上用场,如果您对一个偏远的位置做出展示,你必须给观众指示不同的事情。
第二,您会看到如何使最低限度的代码来制作文本聊天,一个输入文本框中输入的文本,会在所有用户的屏幕上显示出来。
第三,使用一个共享影片剪辑,您会看到如何在远程观众的屏幕上打开一个web页面。
这些都是微不足道的例子,但他们显示出你可以使用远程共享对象来做不同的事情。
其余的就要看你的想象力了。
当声音一个变量时,你可以声明它的类型:
privatevarso:
SharedObject;
通用实例化一个共享对像的格式,如图4-1:
图4-1.InstantiatingSharedObjectclass
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.设立共享对象存储:
插槽
当你设置了一个共享对像实例,你需要基于共享对像的属性上设置一个存储系统。
不同于早期版本的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”表示客户端更改了共享对象
这个应用程序的目的是:
帮助你了解关于共享对像是怎么工作的一些东西,但由于设计,它着重于处理的步骤和如何改变共享对像中的值。
暂时这并不共享任何远端。
以下步骤显示了如何设置它:
1建立一个BasicSO.fla
2在文档类中输入BasicSO
3建立一个BasicSO.as文件
4在BasicSO.as文件中输入以下代码:
Example4-1.BasicSO.as
CodeView:
package
{
importflash.display.Sprite;
import.SharedObject;
importflash.events.NetStatusEvent;
importflash.events.SyncEvent;
import.NetConnection;
//import.ObjectEncoding;
publicclassBasicSOextendsSprite
{
privatevartest_so:
SharedObject;
privatevarnc:
NetConnection;
privatevarmonthDay:
Date;
privatevargood:
Boolean;
publicfunctionBasicSO()
{
//NetConnection.defaultObjectEncoding=.ObjectEncoding.AMF0;
//Connect
varrtmpNow:
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)
{
//Setupsharedobject
test_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);
}
}
}
5测试影片
运行例子后,在输出窗口中会显示:
clear
success
Katmandu
15
true
250
你可以看到,共享对象在ActionScript中具有基本数据类型与其他变量与属性一样,像其它对像和变量一样可以提取。
4.2.3.同步的共享对像
每当任何共享对象的属性,或“插槽”改变,这种改变一定会广播给所有这些连接。
处理这一事件的程序是SyncEvent.SYNC,回调。
每一次任何数据属性的变化,一个改变事件会触发SyncEvent.SYNC,用这种方式回调,,在所有的连接中,所有改变的属性会被更新。
一般格式是如下:
share_so.addEventListener(SyncEvent.SYNC,syncSO);
….
privatefunctionsyncSO(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)语句,和以往一样都不要忘记把它包含在您的应用程序中。
(当您调试您的代码,通常你会发现,共享对象连接已经离开了,没有它,您的共享对象,将不能正确运行)。
4.3.简单例子:
共享影片
看看共享对象如何与远程网页工作,这简单的项目使用一个影片剪辑作为一个共享对象。
这个例子说明如何设置并在Stage(你的舞台和所有连接到相同共享对像的)范围内移动影片。
在创建在线幻灯片放映应用程序的工作中,像是与PowerPoint简报,你需要的所有观众看到指示器移动到屏幕上的位置,如果你不想让他们关注的焦点。
使用一个岛屿影片剪辑,作为一个指示器,这个应用程序有4个岛的名字在舞台的四个角落。
四个名字,只是简单地放置在舞台,当你在屏幕上移动指示器,对所有连接到应用程序的屏幕上会跑到相同的位置。
您将使用这些类和对象在应用程序中:
Classes
NetConnection
SharedObject
NetStatusEvent
SyncEvent
MouseEvent
Objects
MovieClip
(1)
请按照下列步骤操作,以制作该项目:
1.建立一个MinSOmc.fla
2.如图4-2中所示,在舞台的4个角落,建立一个不同的岛屿的名称
3.如图4-2中所示,用绘图工具绘制一个岛屿(或者画一个箭头指示器或者其它东西)
4.选择指示器把它转换为影片剪辑,名称为Island
5.把指示器从舞台中删除,因为我们只需要从库中调用
6.建立一个MinSOmc.as.
7.在MinSOmc.as中添加如下代码
Example4-2.MinSOmc.as
CodeView:
package
{
importflash.display.Sprite;
import.SharedObject;
importflash.events.NetStatusEvent;
importflash.events.SyncEvent;
import.NetConnection;
importflash.events.MouseEvent;
//import.ObjectEncoding;
publicclassMinSOmcextendsSprite
{
privatevarpointer_so:
SharedObject;
privatevarnc:
NetConnection;
privatevargood:
Boolean;
privatevarisland:
Island;
publicfunctionMinSOmc()
{
//NetConnection.defaultObjectEncoding=.ObjectEncoding.AMF0;
//Connect
varrtmpNow:
String="rtmp:
//192.168.0.11/basicSO";
nc=newNetConnection;
nc.connect(rtmpNow);
nc.addEventListener(NetStatusEvent.NET_STATUS,doSO);
island=newIsland;
addChild(island);
island.x=200;
island.y=200;
island.addEventListener(MouseEvent.MOUSE_DOWN,beginDrag);
island.addEventListener(MouseEvent.MOUSE_UP,endDrag);
}
privatefunctiondoSO(e:
NetStatusEvent):
void
{
good=e.info.code=="NetConnection.Connect.Success";
if(good)
{
//Sharedobject
pointer_so=SharedObject.getRemote("point",nc.uri,false);
pointer_so.connect(nc);
pointer_so.addEventListener(SyncEvent.SYNC,doUpdate);
}
}
privatefunctiondoUpdate(se:
SyncEvent):
void
{
for(varcl:
uint;cl{
trace(se.changeList[cl].code);
if(se.changeList[cl].code=="change")
{
switch(se.changeList[cl].name)
{
case"xpos":
island.x=pointer_so.data.xpos;
break;
case"ypos":
island.y=pointer_so.data.ypos;
break;
}
}
}
}
privatefunctionbeginDrag(e:
MouseEvent)
{
island.addEventListener(MouseEvent.MOUSE_MOVE,moveMc);
island.startDrag();
}
privatefunctionendDrag(e:
MouseEvent)
{
island.stopDrag();
}
privatefunctionmoveMc(e:
MouseEvent)
{
e.updateAfterEvent();
pointer_so.setProperty("xpos",island.x);
pointer_so.setProperty("ypos",island.y);
}
}
}
因为这个应用程序也是使用basicSO服务端应用程序,你不需要在服务端应用程序目录中添加一个新的目录。
图4-2显示了你可看到当你测试应用程序和开始在舞台四周移动共享对像影片。
最初,共享对像连接触发了一个sync事件,结果是一个”clear”消息,可以在输出窗口中看到。
然后,运动的影片剪辑改变了共同对象的值,因为你是看当地的运动,同步代码显示了“success”。
如果你在远程客户端移动对像,您将会看到“change”,但因为它只是运行在测试模式中,并没有在一个远程客户端中,您将不会看到任何“change”的代码,除非你发布代码和打开一个浏览器并运行它在一个单独的客户端中。
图4-2.Movieclipsharedobject
为了看看所有这些是怎么工作的,从moveMC函数开始:
pointer_so.setProperty("xpos",island.x);
pointer_so.setProperty("ypos",island.y);
这两行是设置pointer_so的数据:
xpos和ypos属性的值为共享影片的位置。
当发生改变,触发一个SYNC事件。
移动动作发起一个SyncEvent.changeList“change”的代码在远程客户端的播放器上。
(对于本地客户端就是――动影片剪辑――代码是“success”,而非“change”)。
然后通过遍历客户的数组,然后共享对象的属性(名为xpos和ypos)。
遍历首先找到每个客户和指示在哪里改变,然后更新影片剪辑的位置的值。
整个过程大概如下:
∙一个客户端移动共享对像(岛屿的影片剪辑)
∙在客户端的应用程序中移动更新共享对像的值
∙共享对像的改变对所有远程客户端发出一个同步事件:
changeList代码为”change”
∙doUpdate()函数指定共享对像属性的值为本地影片的x和y属性,从而可以移动影片剪辑
注意到,在介绍这一章中,你可以用共享对象做了很多实际的事了。
使用多个模块,您可以建立一个模块(一控制模块)在其它模块页面中远程控制对像。
然而,用户在其他模块中,是无法控制任何共享对象,即使他们可以看到控制模块做出的改变。
同样,您就可以设立一个应用程序:
有一个发言者指向网页的不同部分,当他在介绍时。
同样,在游戏,你可以做各种有趣的事情,两个或两个以上的球员控制影片剪辑移动和移动其他远程客户端。
用FMS3制作简单的聊天应用程序
4.4.简单例子:
共享文本
已经看了一个影片剪辑的简单例子,现在来看看共享文本。
本质上是一样的,而是立足的变化,共享对象的时段对运动鼠标的立场的阶段,变化的基础上打字输入的用户。
替换基于共享对像移动鼠标位