Flash P2P 对象复制详解
简介
flash player 10.1增加了p2p(pear to pear)的支持,可以先看下flash最简单的p2p对象复制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集是否有这个索引,
- 如果组内同一个片段索引对应多个不同的数据片段,那么请求方接受的是哪个,将不确定,建议一个索引对应唯一的对象片段
» 本文链接地址:https://www.litefeel.com/flash-p2p-for-object-replication/
» 订阅本站:www.litefeel.com/feed/
» Host on Linode VPS
@liuhan
没有办法预先知道组内是否有某个数据。
您好,有个问题请教一下:
netGroup.addWantObjects(x,y)
我请求组内指定范围x->y的数据块。我想在调用addWantObjects前知道组内是否有(x到y)的数据,没有的话我立马用其他办法获取。
用post()广播查询的方法不能接受。
有没其他简单高效的办法?谢谢
@sun11086
只有腾讯微博:http://t.qq.com/lite3_
博主新年快乐.O(∩_∩)O~
有新浪微博吗?
新年快乐!拜个早年