·您当前的位置:首页 > 技术教程 > Rtmp技术 >

[AS3]P2P应用(rtmfp基于as3的应用源代码实例)

时间:2014-05-11 09:319ria.com
将A中的myName和myID复制粘贴到B中的oppName和oppID中,单击B中的Call按钮呼叫A, 当A中有呼叫的提示信息时,在A中单击Accept按钮,这样P2P连接就建立了

在A、B两台具有静态IP的机器上打开本页后,程序首先生成一个随机的用户名myName并自动连接到Adobe官方的stratus服务器,连接 成功后,程序会自动获取一个myID号。将A中的myName和myID复制粘贴到B中的oppName和oppID中,单击B中的Call按钮呼叫A, 当A中有呼叫的提示信息时,在A中单击Accept按钮,这样P2P连接就建立了!P2P连接建立后,可以播放对方视频,可以进行文本聊天。

通过该示例你可以:

1、了解如何使用新的RTMFP协议连接到远程服务器。

2、了解如何建立P2P连接。

3、了解如何发布和接收P2P流。

4、了解如何进行文本聊天。

已知问题:

1、(后经测试,是可以在广域网使用的!)。

2、在进行P2P呼叫的时候速度慢,即使是在同一个局域网内。

SWF文件在下面,你可以将它另存到桌面上使用,要注意允许SWF访问网络及相关的安全设置:

源代码如下:

  1. package {   
  2. import flash.display.MovieClip;   
  3. import fl.managers.StyleManager;   
  4. import flash.text.TextFormat;   
  5. import flash.net.NetConnection;   
  6. import flash.net.NetStream;   
  7. import flash.net.ObjectEncoding;   
  8. import flash.net.URLLoader;   
  9. import flash.net.URLRequest;   
  10. import flash.net.URLRequestMethod;   
  11. import flash.net.URLRequestHeader;   
  12. import flash.net.URLVariables;   
  13. import flash.events.Event;   
  14. import flash.events.IOErrorEvent;   
  15. import flash.events.MouseEvent;   
  16. import flash.events.AsyncErrorEvent;   
  17. import flash.events.SecurityErrorEvent;   
  18. import flash.events.NetStatusEvent;   
  19. import flash.media.SoundTransform;   
  20. import flash.media.Camera;   
  21. import flash.media.Microphone;   
  22. public class p2p extends MovieClip {   
  23.    private var fmsPath:String;   
  24.    private var myNC:NetConnection;   
  25.    private var controlStream:NetStream;   
  26.    private var outgoingStream:NetStream;   
  27.    private var incomingStream:NetStream;   
  28.    private var listenerStream:NetStream;   
  29.    private var yourName:String;   
  30.    private var yourID:String;   
  31.    private var oppName:String;   
  32.    private var oppID:String;   
  33.    private var WebServiceUrl:String;   
  34.    //正式开始喽   
  35.    public function p2p() {   
  36.     setCommonStyle();   
  37.     init();   
  38.    }   
  39.    private function setCommonStyle() {   
  40.     //CuPlayer.com提示:设置所有组件的样式   
  41.     var myTF:TextFormat=new TextFormat ;   
  42.     myTF.size=12;   
  43.     StyleManager.setStyle("textFormat",myTF);   
  44.    }   
  45.    //CuPlayer.com提示:初始化工作   
  46.    private function init() {   
  47.     fmsPath="rtmfp://stratus.adobe.com/HawkPrerelease-4e4efa13755c/FMSer.cn";   
  48.     WebServiceUrl="http://76.74.170.61/cgi-bin/reg";   
  49.     myNC=new NetConnection();   
  50.     myNC.client=this;   
  51.     myNC.objectEncoding=ObjectEncoding.AMF3;   
  52.     myNC.addEventListener(NetStatusEvent.NET_STATUS,netStatus);   
  53.     myNC.addEventListener(SecurityErrorEvent.SECURITY_ERROR,securityError);   
  54.     myNC.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncError);   
  55.     //CuPlayer.com提示:开始连接服务器   
  56.     myNC.connect(fmsPath);   
  57.     //CuPlayer.com提示:随机生成用户名   
  58.     myNameTxt.text="FMSer"+int(Math.random()*100);   
  59.     sendBtn.addEventListener(MouseEvent.CLICK,sendChatMsg);   
  60.    }   
  61.    
  62.    private function asyncError(e:AsyncErrorEvent) {   
  63.    }   
  64.    private function securityError(e:SecurityErrorEvent) {   
  65.    }   
  66.    //连接功能后将自己的用户名和ID传给WEB服务器暂存   
  67.    private function netStatus(e:NetStatusEvent) {   
  68.     switch (e.info.code) {   
  69.      case "NetConnection.Connect.Success" :   
  70.       trace("CuPlayer.com提示:连接成功!");   
  71.       myIDTxt.text=myNC.nearID;   
  72.       callWebService();   
  73.       break;   
  74.      case "NetConnection.Connect.Failed" :   
  75.       trace("CuPlayer.com提示:连接失败!");   
  76.       break;   
  77.      case "NetConnection.Connect.Rejected" :   
  78.       trace("CuPlayer.com提示:连接失败!");   
  79.       break;   
  80.      case "NetConnection.Connect.Closed" :   
  81.       trace("CuPlayer.com提示:连接中断!");   
  82.       break;   
  83.     }   
  84.    
  85.    }   
  86.    //CuPlayer.com提示:完成用户信息提交工作   
  87.    private function callWebService() {   
  88.     var urlLoader:URLLoader = new URLLoader();   
  89.     urlLoader.addEventListener(Event.COMPLETE, completeHandler);   
  90.     urlLoader.addEventListener(IOErrorEvent.IO_ERROR, ioerrorHandler);   
  91.     var urlRequest:URLRequest=new URLRequest(WebServiceUrl);   
  92.     var parameter:URLVariables=new URLVariables ;   
  93.     parameter.username=myNameTxt.text;   
  94.     parameter.identity=myIDTxt.text;   
  95.     urlRequest.data=parameter;   
  96.     urlLoader.load(urlRequest);   
  97.    }   
  98.    //准备呼叫和被呼叫   
  99.    private function completeHandler(e:Event) {   
  100.     callBtn.addEventListener(MouseEvent.CLICK,startCall);   
  101.     completeRegistration();   
  102.    }   
  103.    private function ioerrorHandler(e:IOErrorEvent) {   
  104.    }   
  105.    //CuPlayer.com提示:开始呼叫   
  106.    private function startCall(e:MouseEvent) {   
  107.     oppName=oppNameTxt.text;   
  108.     oppID=oppIDTxt.text;   
  109.     placeCall(oppName,oppID);   
  110.    }   
  111.    //CuPlayer.com提示:呼叫主函数   
  112.    private function placeCall(tmpOppName:String,tmpOppID:String) {   
  113.     msgTxt.text="正在呼叫:"+tmpOppName+"...";   
  114.     //尝试播放对方视频   
  115.     controlStream=new NetStream(myNC,tmpOppID);   
  116.     controlStream.addEventListener(NetStatusEvent.NET_STATUS,controlHandler);   
  117.     controlStream.play("control" +tmpOppName);   
  118.     //CuPlayer.com提示:对外发布点对点视频   
  119.     outgoingStream=new NetStream(myNC,NetStream.DIRECT_CONNECTIONS);   
  120.     outgoingStream.addEventListener(NetStatusEvent.NET_STATUS,outgoingStreamHandler);   
  121.     outgoingStream.publish("media-caller");   
  122.     var o:* = new Object();   
  123.     o.onPeerConnect =function (tmpNS:NetStream){   
  124.     msgTxt.text="CuPlayer.com提示正在建立P2P连接..."   
  125.     };   
  126.     oooutgoingStream.client=o;   
  127.     startAudio();   
  128.     startVideo();   
  129.     //接收来自外部的点对点视频   
  130.     incomingStream=new NetStream(myNC,tmpOppID);   
  131.     incomingStream.addEventListener(NetStatusEvent.NET_STATUS,incomingStreamHandler);   
  132.     incomingStream.play("media-callee");   
  133.     var st:* =new SoundTransform(50);   
  134.     incomingStream.soundTransform=st;   
  135.     //CuPlayer.com提示:被呼叫方接受连接时触发该事件   
  136.     var i:* = new Object();   
  137.     i.onCallAccepted =function (tmpOppName:String){       
  138.     msgTxt.text=tmpOppName+"已经接受了你的呼叫..."   
  139.     };   
  140.     //被呼叫方接受连接时触发该事件   
  141.     i.onIm = function (userName:String,chatMsg:String){   
  142.     chatContentchatContentchatContent.text =chatContent.text + (userName+ ": " + chatMsg + "\n");   
  143.     chatContentchatContentchatContent.verticalScrollPosition =chatContent.textHeight;   
  144.     }   
  145.       
  146.     iiincomingStream.client=i;   
  147.     remoteVideoDisplay.attachNetStream(incomingStream);   
  148.    }   
  149.    private function controlHandler(e:NetStatusEvent) {   
  150.     trace(e.info.code);   
  151.    }   
  152.    private function outgoingStreamHandler(e:NetStatusEvent) {   
  153.     outgoingStream.send("onIncomingCall",myNameTxt.text);   
  154.     trace(e.info.code);      
  155.    }   
  156.    private function startAudio() {   
  157.     var myMic:Microphone=Microphone.getMicrophone(0);   
  158.     outgoingStream.attachAudio(myMic);   
  159.    }   
  160.    private function startVideo() {   
  161.     var myCam:Camera=Camera.getCamera();   
  162.     localVideoDisplay.attachCamera(myCam);   
  163.     outgoingStream.attachCamera(myCam);   
  164.    }   
  165.    
  166.    private function incomingStreamHandler(e:NetStatusEvent) {   
  167.     trace(e.info.code);   
  168.    }   
  169.    //CuPlayer.com提示向Web服务器提交完信息后为连接做准备   
  170.    private function completeRegistration() {   
  171.     listenerStream=new NetStream(myNC,NetStream.DIRECT_CONNECTIONS);   
  172.     listenerStream.addEventListener(NetStatusEvent.NET_STATUS,listenerHandler);   
  173.     listenerStream.publish("control" +myNameTxt.text);      
  174.     var c:* = new Object();   
  175.     c.onPeerConnect = function (tmpNS:NetStream){   
  176.     var caller:* =tmpNS;   
  177.     incomingStream = new NetStream(myNC,caller.farID);   
  178.     incomingStream.addEventListener(NetStatusEvent.NET_STATUS, incomingStreamHandler);   
  179.     incomingStream.play("media-caller");   
  180.     var st:SoundTransformnew SoundTransform(50);   
  181.     incomingStream.soundTransform = st;   
  182.     incomingStream.receiveAudio(false);   
  183.     incomingStream.receiveVideo(false);   
  184.     var i:Objectnew Object();   
  185.     i.onIncomingCall = function (tmpOppName:String){   
  186.     msgTxt.text=tmpOppName+"CuPlayer.com提示正在呼叫你,你接受吗?"   
  187.     acceptBtn.addEventListener(MouseEvent.CLICK,acceptCall)   
  188.     }   
  189.     i.onIm = function (userName:String,chatMsg:String){   
  190.     chatContentchatContentchatContent.text =chatContent.text + (userName+ ": " + chatMsg + "\n");   
  191.     chatContentchatContentchatContent.verticalScrollPosition =chatContent.textHeight;   
  192.     }   
  193.     iiincomingStream.client = i;   
  194.     };   
  195.     listenerStream.client=c;   
  196.    }   
  197.    private function listenerHandler(e:NetStatusEvent) {   
  198.     trace(e.info.code);   
  199.    }   
  200.      
  201.    //CuPlayer.com提示:接受呼叫   
  202.    public function acceptCall(e:MouseEvent) {   
  203.     msgTxt.text="CuPlayer.com提示你已经接受了对方的呼叫...";   
  204.     incomingStream.receiveAudio(true);   
  205.     incomingStream.receiveVideo(true);   
  206.     remoteVideoDisplay.attachNetStream(incomingStream);   
  207.     outgoingStream=new NetStream(myNC,NetStream.DIRECT_CONNECTIONS);   
  208.     outgoingStream.addEventListener(NetStatusEvent.NET_STATUS,outgoingStreamHandler);   
  209.     outgoingStream.publish("media-callee");   
  210.     var o:* = new Object();   
  211.     o.onPeerConnect = function (tmpNS:NetStream){   
  212.        trace(tmpNS.farID);       
  213.     }   
  214.     ;   
  215.     oooutgoingStream.client=o;   
  216.     outgoingStream.send("onCallAccepted",myNameTxt.text);   
  217.     startVideo();   
  218.     startAudio();   
  219.    }   
  220.    //CuPlayer.com提示:发送聊天信息   
  221.    private function sendChatMsg(e:MouseEvent) {   
  222.     var tmpMsg:* =chatTxt.text;      
  223.     if (tmpMsg!=0&&outgoingStream) {   
  224.      chatContentchatContentchatContent.text=chatContent.text+myNameTxt.text+": "+tmpMsg+"\n";   
  225.      outgoingStream.send("onIm",myNameTxt.text,tmpMsg);   
  226.      chatTxt.text="";   
  227.     } else {   
  228.      chatContent.appendText("CuPlayer.com提示发送内容为空或连接尚未建立!"+"\n");   
  229.      chatTxt.text="";   
  230.     }   
  231.    }   
  232. }   
  233. }   

[AS3]P2P应用(rtmfp基于as3的应用源代码实例)

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器