日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

flash player10.1 + FMS4中的p2p功能

發(fā)布時(shí)間:2025/3/21 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 flash player10.1 + FMS4中的p2p功能 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在fms4以前Adobe只允許在stratus中才能使用p2p功能。令人高興的是,在最新發(fā)布的fms4中,p2p功能已經(jīng)集成進(jìn)來(lái)了,這將給實(shí)時(shí)視頻類的應(yīng)用帶來(lái)更高的效率,adobe這次很給力!

為了使用p2p,開(kāi)發(fā)用的flex sdk至少要4.1以上(當(dāng)然最高版本是代號(hào)為hero的4.5版本,可從adobe的官網(wǎng)下載),另外還需要fms4(同樣可從adobe官網(wǎng)下載開(kāi)發(fā)版本)。

先上完整代碼吧:

package {import fl.controls.Button;import fl.controls.Label;import fl.controls.TextArea;import flash.display.Sprite;import flash.events.MouseEvent;import flash.events.NetStatusEvent;import flash.net.GroupSpecifier;import flash.net.NetConnection;import flash.net.NetGroup;import flash.net.NetGroupReplicationStrategy;import flash.text.TextFormat;public class p2p_HelloWorld extends Sprite {private var _lbl:Label;private var _btnAddToWant:Button;private var _btnGenData:Button;private var _btnAddToHave:Button;private var _txtObj:TextArea;private var _txtOutput:TextArea;private var _data:Vector.<String>;private var _dataLength:uint = 100;private var _nc:NetConnection;private var _ng:NetGroup;private var _spec:GroupSpecifier;private var _server:String = "rtmfp://localhost/HelloServer";private var _groupName:String = "myGroup";private var _connected:Boolean = false;public function p2p_HelloWorld(){init();}private function init():void {this._btnAddToWant = btnAddToWant;this._btnAddToHave = btnAddToHave;this._btnGenData = btnGenData;this._txtObj = txtObj;this._txtOutput = txtOutput;this._lbl = lbl;var style:TextFormat = new TextFormat("宋體", 12, 0x000000,false,false,false,null,null,null,null,null,null,5);this._btnAddToHave.setStyle("textFormat", style);this._btnAddToWant.setStyle("textFormat", style);this._btnGenData.setStyle("textFormat", style);this._txtObj.setStyle("textFormat", style);this._txtOutput.setStyle("textFormat", style);this._lbl.setStyle("textFormat", style);this._btnGenData.addEventListener(MouseEvent.CLICK, _btnGenData_Click);this._btnAddToHave.addEventListener(MouseEvent.CLICK, _btnAddToHave_Click);this._btnAddToWant.addEventListener(MouseEvent.CLICK, _btnAddToWant_Click);//先連接到服務(wù)器_nc = new NetConnection();_nc.addEventListener(NetStatusEvent.NET_STATUS, _nc_Net_Status);_nc.connect(_server);output("正在連接 " + _server + " ...");}private function _nc_Net_Status(e:NetStatusEvent):void {output(e.info.code);switch (e.info.code){case "NetConnection.Connect.Success": //連接成功后,要設(shè)置NetGroupthis._spec = new GroupSpecifier(this._groupName); _spec.serverChannelEnabled = true;//設(shè)置允許創(chuàng)建到服務(wù)端的通道_spec.objectReplicationEnabled = true;//允許對(duì)象復(fù)制_ng = new NetGroup(_nc, _spec.groupspecWithAuthorizations());_ng.addEventListener(NetStatusEvent.NET_STATUS, _nc_Net_Status);break;case "NetGroup.Connect.Success":_connected = true;_ng.replicationStrategy = NetGroupReplicationStrategy.LOWEST_FIRST;//設(shè)置數(shù)據(jù)塊傳輸時(shí),先傳遞索引號(hào)最小的塊break;case "NetGroup.Replication.Fetch.SendNotify": //每當(dāng)"接收方"有數(shù)據(jù)到達(dá)(但尚未開(kāi)始接收)時(shí),將觸發(fā)此處理output(" -->通知:數(shù)據(jù)塊 " + e.info.index + " 即將被接收");break;case "NetGroup.Replication.Fetch.Failed": //“接收方”有數(shù)據(jù)接收失敗時(shí),將觸發(fā)此處理output(" -->錯(cuò)誤:數(shù)據(jù)塊 " + e.info.index + " 接收失敗");break;case "NetGroup.Replication.Fetch.Result": //“接收方”每次成功接收到數(shù)據(jù)時(shí),觸發(fā)此段處理output(" -->數(shù)據(jù)塊 " + e.info.index + " 已成功接收,值:" + e.info.object);_ng.addHaveObjects(e.info.index, e.info.index); //接收完成以后,將接收到的數(shù)據(jù)加入“待發(fā)送對(duì)象列表"中,這樣人越多,傳輸越穩(wěn)定,速度也越快 if (_data == null) {_data = new Vector.<String>(this._dataLength);}_data[e.info.index] = e.info.object.toString();//說(shuō)明全部接收完了if (e.info.index == this._dataLength - 1) {for (var i:int = 0; i < _dataLength; i++){_data[i] = "這是數(shù)據(jù) " + i.toString();this._txtObj.appendText("index:" + i.toString() + ",data:" + _data[i] + " | ");}}break;case "NetGroup.Replication.Request": //每當(dāng)有數(shù)據(jù)傳輸請(qǐng)求時(shí),“提供方”將觸發(fā)此處理_ng.writeRequestedObject(e.info.requestID, _data[e.info.index]);//這里才是真正的響應(yīng)“接收方",將指定的數(shù)據(jù)發(fā)送過(guò)去output(" -->數(shù)據(jù)塊 " + e.info.index + " 請(qǐng)求被發(fā)送,本次請(qǐng)求ID:" + e.info.requestID);break;default:break;}}//初始化生成數(shù)據(jù)private function _btnGenData_Click(e:MouseEvent):void {this._txtObj.text = "";if (_data==null){_data = new Vector.<String>(this._dataLength);}for (var i:int = 0; i < _dataLength; i++){_data[i] = "這是數(shù)據(jù) " + i.toString();this._txtObj.appendText("index:" + i.toString() + ",data:" + _data[i] + " | ");}}//將生成的初始數(shù)據(jù),添加到待發(fā)送的“列表”中private function _btnAddToHave_Click(e:MouseEvent):void {this._ng.addHaveObjects(0, _dataLength - 1);}//請(qǐng)求接收數(shù)據(jù)private function _btnAddToWant_Click(e:MouseEvent):void{this._ng.addWantObjects(0, _dataLength - 1);}//輸出結(jié)果private function output(s:String):void {this._txtOutput.appendText(s + "\n");}}}

在這段代碼中我們看到了一個(gè)全新的NetGroup對(duì)象,要使用p2p,“接收方”與“接收方”必須先加入到“相同名稱"的NetGroup中。而且要發(fā)送的數(shù)據(jù),必須分解有順序的一塊一塊(通常用有序數(shù)組來(lái)保存這些數(shù)據(jù)塊),然后"發(fā)送方"調(diào)用addHaveObjects方法設(shè)置待發(fā)送的數(shù)據(jù)塊,而"接收方"則調(diào)用addWantObjects請(qǐng)求需要接收的塊。

一旦"接收方"調(diào)用了addWantObjects方法后,"發(fā)送方"便會(huì)進(jìn)入"NetGroup.Replication.Request"狀態(tài),此時(shí)"發(fā)送方"響應(yīng)"接收方"的請(qǐng)求,將需要的數(shù)據(jù)塊以udp協(xié)議發(fā)送過(guò)去,然后“接收方”會(huì)收到"NetGroup.Replication.Fetch.SendNotify"的數(shù)據(jù)到達(dá)通知,如果成功接收,將進(jìn)入“NetGroup.Replication.Fetch.Result”狀態(tài),全部接收完成后,開(kāi)發(fā)人員可根據(jù)需要將這些塊重新合并成原始對(duì)象。

處理過(guò)程示意圖如下:

文中代碼最終的運(yùn)行截圖:

測(cè)試方法:發(fā)送方先點(diǎn)擊“生成初始數(shù)據(jù)”,然后點(diǎn)擊“添加要發(fā)送的數(shù)據(jù)”,最后接收方點(diǎn)擊“接收數(shù)據(jù)”

此外,如果多開(kāi)幾個(gè)"接收方",可以驗(yàn)證一下“接收方”收到數(shù)據(jù)后是否能變成數(shù)據(jù)提供者,向其它接收方提供數(shù)據(jù),也就是所謂的p2p中"人越多,速度越快,傳輸越穩(wěn)定"的現(xiàn)象

但是,FMS4中的p2p也不是完美無(wú)缺,實(shí)際測(cè)試下來(lái),目前尚不能打洞,即所有peer端如果在同一個(gè)網(wǎng)段,傳輸是正常的,但是如果不是同一個(gè)網(wǎng)段則無(wú)法進(jìn)行p2p。

不過(guò),如果參與p2p的機(jī)器越多,接收到數(shù)據(jù)的客戶端根據(jù)文中的代碼處理,也可以變成發(fā)送方,這表示有可能本來(lái)在同一個(gè)網(wǎng)段的其它用戶原本沒(méi)有數(shù)據(jù)來(lái)源,但是只要本網(wǎng)段有一個(gè)用戶接收到數(shù)據(jù)后(比如這個(gè)用戶有多重網(wǎng)絡(luò)),本網(wǎng)段的其它用戶也能接收數(shù)據(jù)了,這在一程度上能解決打洞的矛盾。

示例源文件下載:http://files.cnblogs.com/yjmyzz/p2pTest.7z

轉(zhuǎn)載于:https://www.cnblogs.com/yjmyzz/archive/2010/11/25/1888072.html

總結(jié)

以上是生活随笔為你收集整理的flash player10.1 + FMS4中的p2p功能的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。