页面

2010年4月20日星期二

flash p2p理解

公司策划要制作一款对战游戏,这几天一直在想消息交互的方案,之前一直在考虑的是服务器中转的方式,已经完成两种比较合适的方案,不过不在今天 讨论范围之内,因为了解到flash player 10是支持P2P功能的,所以今天花了一早上的时间了解了一下,现把所得记录一下:   首先,所要用的API类是NetConnection和NetStream两个类及NetStatusEvent事件类,然后先说一下 NetConnection和NetStream的关系,至少是在p2p时的关系,其它Rtmp的时候没有研究过。
  先用 NetConnection来连接Adobe的stratus服务来获得唯一的PeerID,以供p2p时作为客户端的标识,同时该peerID保存在 NetConnection的nearID中,然后需要建立一个流,一个真正进行交互的流,一个DIRECT_CONNECTIONS类型的 NetStream,来发布自己的身份,同时也可以作为以后交互的时候的消息sender,并同时需要做OnPeerConnect侦听,在其它 NetStream订阅该流时触发,同时该流的farID等同于NetConnectiont的nearID。
  当有一个指定为该流 peerID的NetStream订阅该流时,首先会触发该NetConnection的netStatus事件,e.info.code 为"NetStream.Connect.Success",同时订阅流保存在 NetConnection.unConnectedPeerStreams当中,接来触发NetStream.onPeerConnect(该方法注册 为Netstream.client来支持回调),当执行完onPeerConnect后,订阅流从 NetConnection.unConnectedPeerStreams中移到NetStream.peerStreams中,这样就可以完成从该发 布流向订阅流发消息(通过send("方法名",参数),然后在订阅流方的client对象中定义相应方法名的回调函数)。
  但这样只完成了单 向的数据传送,订阅流同时还要向发布流发送消息,因此需要在订阅流订阅的时候同时建立一个发布流,publish(),然后在 NetStream.onPeerConnect()时创建一个指定为订阅方PeerID的订阅流,play(),这样对呼叫方就有两种作法:1)呼叫方 创建发布流时指定回调对象实现onPeerConnect方法,这样发布方创建订阅流并订阅时会触发该方法;2)呼叫方为发布流建立netStatus事 件侦听,因为发布方订阅流的订阅会触发该发布流的两个事件(NetStream.play.reset和NetStream.play.start),这 样就实现了双向交互。

  当然这是最简单的方法,比较完美一点的办法是各有一个publishStream和CallStream来管理 双方的连接,而在连接的时候创建出两个NetStream:OutgoingStream和inComingStream,分别来处理这一对peer的消 息交互
  发布方:创建publishStream,发布自己的身份,注册onPeerConnect回调;
  呼叫方:创建 callStream,订阅发布者;同时创建一个outgoingStream,注册一个被订阅的事件侦听,发布一个流,同时创建一个 incomingStream,并注册一个回调;
  发布方:接收到呼叫方的连接事件,在onPeerConnect中创建一个对应呼叫方的 incomingStream,注册一个消息回调,订阅;
  呼叫方:发布方的incomingStream的订阅触发呼叫方 outgoingStream的"NetStream.play.start"事件,发送一个"onIncomingCall"消息;
  发布 方:呼叫方的outgoingStream发送的"onIncomingCall"消息触发了发布方的消息回调,在消息回调中,创建一个 outgoingStream,发送一个"onConnectSuccess"消息;
  至此,一个连接已经建立,在创建 outgoingStream和incomingStream时都为其创建有onIm()的回调,以后的消息交互均是采用该回调。

没有评论:

发表评论