织梦CMS - 轻松建站从此开始!

罗索

[RTMP]Flash P2P应用AS3源代码示例

落鹤生 发布于 2013-04-01 21:20 点击:次 
在A、B两台具有静态IP的机器上打开本页后,程序首先生成一个随机的用户名myName并自动连接到Adobe官方的stratus服务器,连接成功后,程序会自动获取一个myID号
TAG:

经过两天两夜的艰苦努力,史上第一个Flash 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="正在建立P2P连接..."  
  125.     };  
  126.     ooutgoingStream.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.     chatContentchatContent.text =chatContent.text + (userName+ ": " + chatMsg + "\n");  
  143.     chatContentchatContent.verticalScrollPosition =chatContent.textHeight;  
  144.     }  
  145.      
  146.     iincomingStream.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.    //向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:SoundTransform= new SoundTransform(50);  
  181.     incomingStream.soundTransform = st;  
  182.     incomingStream.receiveAudio(false);  
  183.     incomingStream.receiveVideo(false);  
  184.     var i:Object= new Object();  
  185.     i.onIncomingCall = function (tmpOppName:String){  
  186.     msgTxt.text=tmpOppName+"正在呼叫你,你接受吗?"  
  187.     acceptBtn.addEventListener(MouseEvent.CLICK,acceptCall)  
  188.     }  
  189.     i.onIm = function (userName:String,chatMsg:String){  
  190.     chatContentchatContent.text =chatContent.text + (userName+ ": " + chatMsg + "\n");  
  191.     chatContentchatContent.verticalScrollPosition =chatContent.textHeight;  
  192.     }  
  193.     iincomingStream.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="你已经接受了对方的呼叫...";  
  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.     ooutgoingStream.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.      chatContentchatContent.text=chatContent.text+myNameTxt.text+": "+tmpMsg+"\n";  
  225.      outgoingStream.send("onIm",myNameTxt.text,tmpMsg);  
  226.      chatTxt.text="";  
  227.     } else {  
  228.      chatContent.appendText("发送内容为空或连接尚未建立!"+"\n");  
  229.      chatTxt.text="";  
  230.     }  
  231.    }  
  232. }  
  233. }  

 

(秩名)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201304/16573.html]
本文出处:百度博客 作者:秩名
顶一下
(0)
0%
踩一下
(1)
100%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容