Flash P2P 对象复制详解[转]
自从flash player 1o.1就开始支持p2p
关于flash p2p(pear to pear)对象复制的简单介绍和Demo 请点这里。
对象复制
调用NetGroup的 addHaveObjects()、removeHaveObjects()、addWantObjects()、removeWantObjects()、writeRequestedObject()和 denyRequestedObject() 以将大型数据分解成数据片段,然后将其复制到对等组中的所有节点。
对象复制有两个集合。
Have集:存放自己已经有的对象片段的索引集合,分享数据用。
Want集:存放自己想获取的对象片段是索引集合,获取数据用。
要使用对象复制,必须设置GroupSpecifier的以下两个属性为true。
- serverChannelEnabled 指定 NetGroup 的成员是否可以打开到服务器的通道。默认情况下,此属性为 FALSE。
- objectReplicationEnabled 指定是否为 NetGroup 启用对象复制。默认情况下,此属性为 FALSE(对象复制被禁用)
相关方法
NetGroup.addHaveObjects(startIndex:Number, endIndex:Number):void
索引范围:0 - 9007199254740992的整数
添加自己已经有的对象片段的索引列表,标示自己已经有的索引,仅标示索引,并不真正传对象片段
NetGroup.removeHaveObjects(startIndex:Number, endIndex:Number):void
跟addHaveObjects是相反的
NetGroup.addWantObjects(startIndex:Number, endIndex:Number):void
索引范围:0 - 9007199254740992的整数
添加自己想要的对象片段的索引列表,标示自己想要的索引,只是标示索引,并不真正传的片段
同addHaveObjects是一样的道理
NetGroup.removeWantObjects(startIndex:Number, endIndex:Number):void
这个跟addWantObjects是相反的
NetGroup.writeRequestedObject(requestID:int, object:Object):void
当组内成员请求先前用addHaveObjects方法公布的数据时,可以用这个方法将对象片段传送给请求者.
在 flash.events.NetStatusEvent.info.code="NetGroup.Replication.Request"事件里调用。
如果Have集里没有这个对象片段的索引,则不会触发该事件。
NetGroup.denyRequestedObject(requestID:int):void
当组内成员请求先前用addHaveObjects方法公布的数据时,可以用这个方法拒绝将对象片段传送给请求者.
在 flash.events.NetStatusEvent.info.code="NetGroup.Replication.Request"事件里调用。
如果Have集里没有这个对象片段的索引,则不会触发该事件。
流程
场景:Provider共享数据给组成员使用, Receiver成员想要获取数据
- Provider 调用方法 addHaveObjects 标示要共享的(已经拥有的)对象片段的索引列表
不会触发事件 - Receiver 调用方法 addWantObjects 向组内请求数据片段
- Receiver 触发事件 NetStatusEvent.NET_STATUS
info.code = "NetGroup.Replication.Fetch.SendNotify"
info.index:Number 属性是请求的对象片段的索引。
由此可见请求每个片段Receiver都会触发该事件 - Provider 触发事件 NetStatusEvent.NET_STATUS
info.code = "NetGroup.Replication.Request"
info.index:Number 属性是已请求的对象的索引。
info.requestID:int 属性是此请求的 ID。
到这里出现两个分支:
1。 传送数据给请求者
- Provider NetGroup.writeRequestedObject() 传送数据给Receiver
requestID 用"NetGroup.Replication.Request"事件的requestID. - Receiver 触发事件 NetStatusEvent.NET_STATUS
info.code = "NetGroup.Replication.Fetch.Result"
info.index:Number 属性是此结果的对象索引。此索引将自动从 Want 集中删除。
info.object:Object 属性是此对象的值。
如果此对象无效,可使用 NetGroup.addWantObjects() 将此索引重新添加到 Want 集。
2。拒绝传送数据给请求者
- Provider NetGroup.denyRequestedObject() 拒绝传送数据给Receiver
requestID 用"NetGroup.Replication.Request"事件的requestID - Receiver 触发事件 NetStatusEvent.NET_STATUS
info.code = "NetGroup.Replication.Fetch.Failed"
info.index:Number 属性是已请求的对象的索引。
如果仍需要此对象,则将重新尝试请求对象。否则 手动调用removeWantObjects方法来取消请求
注意点
- 只要Want集不为空就会向组里请求数据,不论在Have集是否有这个索引,
- 如果组内同一个片段索引对应多个不同的数据片段,那么请求方接受的是哪个,将不确定,建议一个索引对应唯一的对象片段
本文链接地址:http://lite3.cn/?p=1312