Fms教程7 理解共享对象

2024-02-09 09:08
文章标签 教程 对象 共享 理解 fms

本文主要是介绍Fms教程7 理解共享对象,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

理解共享对象
共享对象可以存储任何Flash支持的数据类型。就存放位置来说,共享对象可以分成存在客户端计算机的本地型,以及存放在服务器上的远程型。你可以用它来记录用户的相关信息(如用户名、性别和其它设置参数等),或者用在服务器端,存储其它联机用户实时分享的信息

共享对象意味着用户可以在不同的用户之间、不同的同一台服务器上的应用程序实体。FlashCom server 支持三种不同的共享对象:Local、remote和server-side。下面简单介绍下这三个共享对象。

本地共享对象(Local shared object)
用于存取本地的数据,存储在用户的计算机硬盘中,并可以在不同的时间被其它应用程序访问。本地共享对象的扩展名为.sol,默认的存储路径是 c:/documents and Settings/登录名称/Application Data/Macromedia/Flash Player/服务器网域名称/影片路径/影片文件名.swf/。本地共享对象也可以是短暂的,也就是说只有但应用程序运行时可用。我们也可以不连接 Flashcom server而使用本地共享对象。更多的本地共享对象的信息,可以参考手册中的SharedObject.getLocal方法。
建立和存取本地共享对象的方法如下:

1. 
var so= SharedObject.getLocal('myCookie') //建立本地共享对象 
2. //存储资料 
3. //注意:不管是读取还是写入资料到本地共享对象,都必须通过data属性。 
4. 
so.data.userName='liu21st' ; 
5. 
so.data.msg='世纪流年' ; 
6. 
so.data.counter=10 ; 
7. 
//在默认状态下,以上资料并不会马上写入用户的磁盘,必须等到动画被关闭,或者用户离开你的网站后,才会写入磁盘。如果要立即写入的话,必须使用flush方法。如下: 
8. 
so.flush(); 





确认资料是否存储成功可以通过onstatus事件来获取
返回的code值为

SharedObject.Flush.Success(写入成功)
SharedObject.Flush.Failed(写入失败)
代码示例:

1. 
so.onStatus = function (info){ 
2. var 
status=info.code ; 
3. if ( 
status=='SharedObject.Flush.Success' ){ 
4. 
trace('写入成功' ); } 
5. else 
trace('写入失败'); 





远程共享对象(remote shared object)
通过Flash影片的ActionScript程序,在服务器端建立能让不同联机用户共同存取的资料,称为远程共享对象。和本地共享对象一样,远程共享对象可以被本地计算机存取,不同的是在资料存储在服务器端,所以任何用户都可以连接到远程共享对象访问到相同的信息。默认的存储路径是应用程序实体路径下的 sharedobjects文件夹,扩展名是.fso。
远程共享对象也是最常用的共享对象类型。每当联机用户(或服务器端程序)更新远程共享对象的内容,其它联机到相同应用程序实体的用户将自动收到更新内容的事件(onSync),保持彼此资料的同步。应用程序就是运用这个机制建立的。
例如,你可以打开一个远程共享对象,如电话号码表(在服务器端持久有效)。当用户端对该共享对象作任何更改的时候,修改后的数据对其他连接到该远程共享对象的用户是自同步的。如果因为某种原因,更新了本地的数据信息但是没有连接到服务器,那么所作的更改会在下一次连接到服务器的时候同步远程共享对象。
更多的信息可以参考手册中的SharedObject.getRemote方法。

建立远程共享对象的方法:

1. 
var client_nc = new NetConnection(); 
2. 
client_nc.connect('rtmp://localhost/videochat/room1' ); 
3. 
so = SharedObject.getRemote('records',client_nc.url); //数据资料不写入磁盘 
4. 
so.connect(client_nc); 





远程共享对象的数据读取和写入方法和本地共享对象类似,也是通过data属性和flush方法。
使用下面语句可以把数据资料写入服务器端应用程序文件夹共享对象目录

1. 
so = SharedObject.getRemote('records',client_nc.url,true); 
2. 
//该语句远程共享的文件名将是records.fso 





当远程共享对象的内容改变或者初次联机时,它都会向客户端发出onsync (同步)事件,好让所有联机用户都能实时取得最新的共享对象资料。
示例代码:

1. 
so.onSync = function(list) { 
2. for (var 
k in list) { 
3. 
trace('name = ' + list[k].name + ', event = ' + list[k].code ); 
4. } 
5. 
// do whatever else you want to do here 
6. 
} 





代理共享对象(proxied shared object)
代理共享对象是可以在用户端和服务器端共享的一种远程共享对象,区别在于它是由服务器端的ActionScript程序建立的,例如,在服务器端有两个室的实体chat01和chat02,在chat02中可以连接到在chat01中定义的共享对象,更多的信息可以参考手册的 SharedObject.get方法。
和客户端的sharedobject不同,设置共享变量的值要通过 SharedObject.setProperty,取得共享变量的值通过 SharedObject.getProperty 。
实例代码:

1. 
application.appStart = function() { 
2. 
nc = new NetConnection (); 
3. 
nc.connect('rtmp://' + master_server + '/' + master_instance ); 
4. 
proxySO = SharedObject.get('myProxy',true,nc ); 
5. 
// Now, whenever the client asks for a persistent 
6. // shared object called myProxy they will receive myProxy 
7. // shared object from the master_server/master_instance 
8. 
}; 




1. 
myInfo = SharedObject.get('foo'); 
2. var 
addr = myInfo.getProperty('address' ); 
3. 
myInfo.setProperty('city', 'San Francisco' ); 
4. var 
names = sharedInfo.getPropertyNames (); 
5. for ( 
x in names ){ 
6. var 
propVal = sharedInfo.getProperty(names[x ]); 
7. 
trace('Value of property ' + names[x] + ' = ' + propVal ); 
8. } 





在使用远程共享对象之前,请确认SharedObject.connect 返回 true,在客户端调用SharedObject.flush 方法只是在本地拷贝了一份,要确保服务器端的拷贝,必须在服务器端使用SharedObject.flush 方法,如:

1. 
// Sample server-side code for flushing a persistent shared object 
2. // to the server 
3. // Get the shared object when the application is loaded. 
4. 
application.onAppStart = function() 
5. { 
6. 
application.mySO = SharedObject.get('SharedObjName', true ); 
7. } 
8. 
// When a user disconnects, flush the shared object. 
9. 
application.onDisconnect = function(client ) 
10. { 
11. 
application.mySO.flush (); 
12. } 





如果在同一时间有多个客户端或者服务器端在同步远程共享对象的话,就会出现问题,要解决这个冲突可以通过下面的方法。
1. 使用不同的位置存储不同用户的信息
这是最简单的一种方法,例如,在室给每个用户不同的位置存放数据,同步只修改自己的数据部分。
2. 分配资料所有者
复杂一点的方法就是定义一个用户为有限的时间内该数据资料的所有者,所有者可以锁定服务器端的共享对象,直到返回可用信息后方可同步另外的数据。下面是示例代码:
通过一个记录游戏最高分的应用程序来说明解决同步冲突的问题,当前系统保存的最高分是95,同时有两个用户打破了这个记录,成绩分别为105和110,如果不锁定最高分的话,两个成绩都会同时执行updateHighScore方法,有可能其中一个成绩会无法记录下来。使用锁定共享对象的方法解决了这样一个问题。

1. 
application.onAppStart = function() 
2. { 
3. 
application.scoreSO = SharedObject.get('high_score_so', true ); 
4. 
application.scoreSO.onSync = function(listVal ) 
5. { 
6. 
trace('got an onSync on scoreSO' ); 
7. } 
8. } 
9. 
application.onConnect = function(newClient,name,passwd ) 
10. { 
11. 
newClient.updateHighScore = function(final_score ) 
12. { 
13. 
application.scoreSO.lock (); 
14. if ( 
application.scoreSO.getProperty('high_score_so') < final_score ) 
15. { 
16. 
application.scoreSO.setProperty('high_score_so', final_score ); 
17. } 
18. 
application.scoreSO.unlock (); 
19. } 
20. } 





3. 通知客户端
当服务器端收到客户端的同步请求的时候,SharedObject.onSync事件会通知用户端更改被拒绝,然后提供一个用户界面来给用户解决这种冲突。这种技术通常用于客户端不是经常更新的情况。
4. 接受某些,拒绝其它的
应用程序根据“先到先服务”的原则来解决同步的冲突问题。通常需要于客户自己重新请求来解决冲突。
5. 通过send方法来提高控制级别
SharedObject.send 命令给所有连接到该远程共享对象的客户端广播消息,也包括发送者本人。 (编辑:非熊)

这篇关于Fms教程7 理解共享对象的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693782

相关文章

基于C#实现PDF转图片的详细教程

《基于C#实现PDF转图片的详细教程》在数字化办公场景中,PDF文件的可视化处理需求日益增长,本文将围绕Spire.PDFfor.NET这一工具,详解如何通过C#将PDF转换为JPG、PNG等主流图片... 目录引言一、组件部署二、快速入门:PDF 转图片的核心 C# 代码三、分辨率设置 - 清晰度的决定因

Java Scanner类解析与实战教程

《JavaScanner类解析与实战教程》JavaScanner类(java.util包)是文本输入解析工具,支持基本类型和字符串读取,基于Readable接口与正则分隔符实现,适用于控制台、文件输... 目录一、核心设计与工作原理1.底层依赖2.解析机制A.核心逻辑基于分隔符(delimiter)和模式匹

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

redis中session会话共享的三种方案

《redis中session会话共享的三种方案》本文探讨了分布式系统中Session共享的三种解决方案,包括粘性会话、Session复制以及基于Redis的集中存储,具有一定的参考价值,感兴趣的可以了... 目录三种解决方案粘性会话(Sticky Sessions)Session复制Redis统一存储Spr

javaSE类和对象进阶用法举例详解

《javaSE类和对象进阶用法举例详解》JavaSE的面向对象编程是软件开发中的基石,它通过类和对象的概念,实现了代码的模块化、可复用性和灵活性,:本文主要介绍javaSE类和对象进阶用法的相关资... 目录前言一、封装1.访问限定符2.包2.1包的概念2.2导入包2.3自定义包2.4常见的包二、stati

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

Python pandas库自学超详细教程

《Pythonpandas库自学超详细教程》文章介绍了Pandas库的基本功能、安装方法及核心操作,涵盖数据导入(CSV/Excel等)、数据结构(Series、DataFrame)、数据清洗、转换... 目录一、什么是Pandas库(1)、Pandas 应用(2)、Pandas 功能(3)、数据结构二、安