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成员想要获取数据

  1. Provider 调用方法 addHaveObjects 标示要共享的(已经拥有的)对象片段的索引列表
    不会触发事件
  2. Receiver 调用方法 addWantObjects 向组内请求数据片段
  3. Receiver 触发事件 NetStatusEvent.NET_STATUS
    info.code = "NetGroup.Replication.Fetch.SendNotify"
    info.index:Number 属性是请求的对象片段的索引。
    由此可见请求每个片段Receiver都会触发该事件
  4. Provider 触发事件 NetStatusEvent.NET_STATUS
    info.code = "NetGroup.Replication.Request"
    info.index:Number  属性是已请求的对象的索引。
    info.requestID:int 属性是此请求的 ID。

到这里出现两个分支:
1。 传送数据给请求者

  1. Provider NetGroup.writeRequestedObject() 传送数据给Receiver
    requestID 用"NetGroup.Replication.Request"事件的requestID.
  2. Receiver 触发事件 NetStatusEvent.NET_STATUS
    info.code = "NetGroup.Replication.Fetch.Result"
    info.index:Number  属性是此结果的对象索引。此索引将自动从 Want 集中删除。
    info.object:Object 属性是此对象的值。
    如果此对象无效,可使用 NetGroup.addWantObjects() 将此索引重新添加到 Want 集。

2。拒绝传送数据给请求者

  1. Provider NetGroup.denyRequestedObject() 拒绝传送数据给Receiver
    requestID 用"NetGroup.Replication.Request"事件的requestID
  2. Receiver 触发事件 NetStatusEvent.NET_STATUS
    info.code = "NetGroup.Replication.Fetch.Failed"
    info.index:Number 属性是已请求的对象的索引。
    如果仍需要此对象,则将重新尝试请求对象。否则 手动调用removeWantObjects方法来取消请求

注意点

  1. 只要Want集不为空就会向组里请求数据,不论在Have集是否有这个索引,
  2. 如果组内同一个片段索引对应多个不同的数据片段,那么请求方接受的是哪个,将不确定,建议一个索引对应唯一的对象片段

本文链接地址:http://lite3.cn/?p=1312

原文地址:https://www.cnblogs.com/crkay/p/2229989.html