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

  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. 如果组内同一个片段索引对应多个不同的数据片段,那么请求方接受的是哪个,将不确定,建议一个索引对应唯一的对象片段

  1. lite3 | | #1

    @liuhan
    没有办法预先知道组内是否有某个数据。

  2. liuhan | #2

    您好,有个问题请教一下:
    netGroup.addWantObjects(x,y)
    我请求组内指定范围x->y的数据块。我想在调用addWantObjects前知道组内是否有(x到y)的数据,没有的话我立马用其他办法获取。
    用post()广播查询的方法不能接受。
    有没其他简单高效的办法?谢谢

  3. lite3 | | #3
  4. 免费收录网站 | #4

    博主新年快乐.O(∩_∩)O~

  5. sun11086 | #5

    有新浪微博吗?

  6. 抢东东 | #6

    新年快乐!拜个早年

  1. 本文目前尚无任何 trackbacks 和 pingbacks.
回到顶部