隨筆 - 8  文章 - 55  trackbacks - 0
          <2025年5月>
          27282930123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          朋友的Blog

          最新評論

          閱讀排行榜

          評論排行榜

          FlashCom中的主要對象和組件

          FlashCom中的主要對象和組件
          FlashCom中主要的內(nèi)置對象有:
          1 Camera (攝像機(jī))對象:獲取攝像機(jī)的影像和設(shè)定影像的品質(zhì)。
          2 Video(視訊)對象:顯示從攝像機(jī)獲取或者flashcom服務(wù)器播放的影像。
          3 Microphone(麥克風(fēng))對象:取得麥克風(fēng)的聲音來源和相關(guān)設(shè)定。
          4 SharedObject(共享對象)對象:記錄用戶的資料,或者把訊息實(shí)時(shí)傳遞給所有聯(lián)機(jī)用戶。
          5 NetConnection(聯(lián)機(jī))對象:建立于FlashCom服務(wù)器的聯(lián)機(jī),并且采用rtmp(實(shí)時(shí)訊息通訊協(xié)議)交換資料。
          6 NetStream(串流)對象:在所有聯(lián)機(jī)用戶之間,傳送影音串流。
          常用的組件有:
          1 SimpleConnect 負(fù)責(zé)鏈接FlashCom服務(wù)器的應(yīng)用程序
          2 userColor 設(shè)定聊天文字的顏色
          3 SetBandwidth 選擇聯(lián)機(jī)的帶寬,并由此自動(dòng)設(shè)定攝影機(jī)和麥克風(fēng)的取樣品質(zhì)
          4 ConnectionLight 顯示聯(lián)機(jī)的狀態(tài)
          5 Chat 文字聊天組件
          6 VideoConference 視頻會(huì)議組件
          7 AVPresence 用來接收客戶端的視頻和聲音的組件


          轉(zhuǎn))FlashCom Develop閱讀筆記(一)

          開始--FlashCom Develop閱讀筆記 1
          內(nèi)容:本人學(xué)習(xí)FlashCom Develop的閱讀筆記,陸續(xù)提供,僅供參考,不作它用
          心得作者:Liu21st

          第一章 開始
          一、FlashCom開發(fā)所需安裝的軟件和硬件:
          1. FlashMX authoring
          2. FlashMX Communication Server
          3. ActionScript editor (筆者推薦 editplus )
          4. Flash Player
          5. Camera and Micophone

          二、設(shè)置開發(fā)環(huán)境
          1. 確保FlashCom server已經(jīng)啟動(dòng)
          2. 更改運(yùn)行FlashCom Server的URL地址
          ? new_nc.connect('rtmp:/video/room_01');//本地服務(wù)器
          ? 或者使用
          ? new_nc.connect('rtmp://www.liu21st.com/video/room_01');//遠(yuǎn)程服務(wù)器
          如果使用simpleconnect組件,直接在組件的屬性中設(shè)置即可
          3. 指定發(fā)布格式
          ? 一般為html和swf
          4. 書寫client-side 的as腳本,一般寫在第一幀
          5. 書寫server-side的asc腳本,一般為main.asc或組件對應(yīng)的app_name.asc
          6. 加載組件,如果使用默認(rèn)的組件,可以通過下面的語句簡單加載
          ? load('components.asc');//該文件在scriptlib目錄下面
          7. 初始化 client-side 代碼. 給第一行添加下面代碼
          ? #include 'Netdebug.as'
          ? 以便進(jìn)行NetConnection 調(diào)試(ps.新版的FlashCom Server已經(jīng)不包含netdebug.as文件,需要安裝Flash Remote )
          8. 監(jiān)視應(yīng)用程序
          通過FlashCom自帶的應(yīng)用程序管理器和管理工具來監(jiān)控和管理 [ 中文版見這里 ]

          三、大致開發(fā)步驟
          1. 設(shè)定應(yīng)用程序目錄并在服務(wù)器端注冊
          ? 在服務(wù)器端的application目錄下建立相應(yīng)的子目錄就可以了(也就是項(xiàng)目main.asc文件所放置的目錄了)記住服務(wù)器端的任何改動(dòng)都需要重啟FlashCom Server才能生效
          2. 在客戶端建立鏈接
          1: ? my_nc = new NetConnection();
          2: ? ? my_nc.connect('rtmp://www.liu21st.com/app_name');

          3. 保存客戶端的fla文件到任何地方(如果涉及后臺(tái)交互的話建議保存在webserver目錄下)
          4. 如果包含client端需要相應(yīng)的server端的asc文件,請拷貝到server端的相應(yīng)目錄(建議保持和客戶端相同的文件名,而只是后綴不同)
          5. 然后發(fā)布你的swf文件并運(yùn)行

          默認(rèn)的服務(wù)器端asc文件存儲(chǔ)位置在C:\Program files\Macromedia\Flash
          Communication Server MX\applications in Windows or /opt/macromedia/flashcom/applications
          on UNIX.當(dāng)你需要?jiǎng)?chuàng)建一個(gè)communciation應(yīng)用程序時(shí),就需要在applications下面建立子目錄,存放下面的數(shù)據(jù)文件:
          asc 服務(wù)器端通信文件
          flv 數(shù)據(jù)流播放文件
          fso 遠(yuǎn)程共享對象數(shù)據(jù)文件
          客戶端的swf和html(或者php等服務(wù)器文件)可以放在你指定的任何目錄,在產(chǎn)品發(fā)布的時(shí)候需要移走fla源文件。
          每一個(gè)應(yīng)用程序的實(shí)例也位于不同的目錄,如:
          my_nc.connect('rtmp://www.liu21st.com/chatApp/room_01')
          my_nc.connect('rtmp://www.liu21st.com/chatApp/room_02')

          如果沒有指定實(shí)例,客戶端實(shí)際上連接到一個(gè)默認(rèn)的名為_defInst_的實(shí)例,可以對不同的實(shí)例建立不同的共享對象
          01 : // One instance of application 'support'
          02 : first_nc = new NetConnection();
          03 : first_nc.connect('myserver.mydomain.com/support/session1');
          04 : first_so = SharedObject.getRemote('CustomerInfo', first_nc.URI, false);
          05 : first_so.connect(first_nc.URI);
          06 :
          07 : // Another instance of application 'support'
          08 : second_nc = new NetConnection();
          09 : second_nc.connect('myserver.mydomain.com/support/session2');
          10 : second_so = SharedObject.getRemote('CustomerInfo', second_nc.URI, false);
          11 : second_so.connect(second_nc.URI);


          四、在FlashCom中使用的文件類型
          1. ASC 和 JS 文件 服務(wù)端使用的文件類型
          ? Flash Communication Server 在 服務(wù)端的scriptlib 目錄下提供了一個(gè)腳本庫,包含了一些組件和Flash Remoting services.的server端腳本
          2. FLV 和 IDX 文件 視頻播放文件和索引文件
          3. SOL, SOR 和 FSO文件 共享對象數(shù)據(jù)文件(依次為Local、Remote和兩者)




          轉(zhuǎn))連接示例--FlashCom Develop閱讀筆記(二)

          連接示例--FlashCom Develop閱讀筆記 2
          一個(gè)簡單的連接服務(wù)器示例
          首先確保服務(wù)器已經(jīng)啟動(dòng),在windows下面可以直接啟動(dòng)服務(wù)就可以了。在Linux下面需要運(yùn)行 server start命令啟動(dòng)。
          在客戶端寫代碼打開連接
          my_nc = new NetConnection();//創(chuàng)建連接對象
          my_nc.connect(targetURI);//連接服務(wù)器
          參數(shù)格式為:其中實(shí)例名可以省略
          rtmp://localhost:port/appName/instanceName //本地服務(wù)器
          也可以省略前面的直接寫成
          rtmp:/appName/instanceName
          rtmp://host:port/appName/instanceName//遠(yuǎn)程服務(wù)器
          注意協(xié)議類型一定要使用rtmp,否則會(huì)連接失敗
          下面是一個(gè)簡單的實(shí)現(xiàn)方法:
          1 : //獲取和設(shè)置攝像頭
          2 : client_cam = Camera.get();
          3 : Live_video.attachVideo(client_cam);
          //建立遠(yuǎn)程連接
          1 : function doConnect() {
          2 : client_nc = new netConnection();
          3 : client_nc.onStatus = function(info) {
          4 : trace('Level: ' + info.level + ' Code: ' + info.code);
          5 : }
          6 : client_nc.connect('rtmp://localhost/doc_connect/room_01');
          7 : }
          //發(fā)布視頻流
          1 : function publishMe() {
          2 : out_ns = new netStream(_root.client_nc);
          3 : out_ns.attachVideo(client_cam);
          4 : out_ns.publish('myTestStream');//采用默認(rèn)的live播放形式
          5 : }
          //播放視頻流
          1 : function playMe() {
          2 : in_ns = new netStream(_root.client_nc);
          3 : Published_video.attachVideo(in_ns);
          4 : in_ns.play('myTestStream');
          5 : }
          定義好這些函數(shù)后,就可以用下面的代碼簡單實(shí)現(xiàn)
          1 : // Connect to the server
          2 : doConnect();
          3 : // Publish the live stream
          4 : publishMe();
          5 : // Play back the stream from the server
          6 : playMe();


          數(shù)據(jù)流--FlashCom Develop閱讀筆記 (三)

          第二章 Flash Communication Server結(jié)構(gòu)概要
          Flash Communciation Server 包含了server端(由一些asc文件組成)和client端(swf文件)
          server端和client端的數(shù)據(jù)傳輸通過Real-Time Message Protocol (RTMP)進(jìn)行實(shí)時(shí)交流,web server通過http服務(wù)把內(nèi)容提供給client端,實(shí)現(xiàn)模式如下圖:

          多用戶可以連接到同一個(gè)應(yīng)用程序Application

          Flash Communciation Server實(shí)際上為不同的用戶之間提供了相互交流的通道。

          基于客戶/服務(wù)器模式的application,服務(wù)器端主要負(fù)責(zé)數(shù)據(jù)的傳輸,由客戶端發(fā)送請求,服務(wù)器端執(zhí)行數(shù)據(jù)查詢和計(jì)算并返回結(jié)果值給客戶端,通常需要保持長時(shí)間的連接。

          Flash Communciation Server提供了兩種方法控制用戶的更多交互:數(shù)據(jù)流和共享對象.
          數(shù)據(jù)流是指在服務(wù)器端和客戶端同步傳遞的音頻、視頻和其它數(shù)據(jù)的信息流,數(shù)據(jù)流可以通過簡單的發(fā)布和訂閱方式實(shí)現(xiàn)。一個(gè)發(fā)布的數(shù)據(jù)流可以實(shí)時(shí)的被看到(如視頻聊天室),

          也可以被錄制下來以后播放。

          錄制的數(shù)據(jù)流被存為Flash Video (FLV) 格式,其中可以包含文本、音頻和視頻等信息。當(dāng)然你也可以把存在的通過第三方的軟件錄制的視頻和音頻文件轉(zhuǎn)換為flv格式的文件。

          共享對象--FlashCom Develop閱讀筆記 (四)

          共享對象
          在FlashCom 開發(fā)過程種可以使用兩種共享對象:本地和遠(yuǎn)程共享對象。
          本地共享對象可以看作是Flash cookie,可以在用戶的本地機(jī)器存放用戶數(shù)據(jù),其本身為Flash player提供,可以無須FlashCom Server的支持。
          遠(yuǎn)程共享對象是由FlashCom Server來管理的,提供了信息和數(shù)據(jù)的同步,以及數(shù)據(jù)的存儲(chǔ)。
          Flash客戶端連接、提交給遠(yuǎn)程共享對象,并且與服務(wù)器端保持同步。信息數(shù)據(jù)還可以發(fā)布到所有連接到遠(yuǎn)程共享對象的客戶端,并通過應(yīng)用程序的session或臨時(shí)文件持續(xù)。更多的信息請參考共享對象類。

          連接外部數(shù)據(jù)源
          根據(jù)FlashCom的數(shù)據(jù)流和共享對象提供的交流模型,F(xiàn)lashCom Server還可以和外部數(shù)據(jù)源交互,例如web 服務(wù)器、關(guān)系數(shù)據(jù)庫,甚至其它的FlashCom Server應(yīng)用程序。例如,你可以寫一個(gè)服務(wù)器端的腳本文件來連接一個(gè)web服務(wù)器或ColdFusion應(yīng)用程序來接收一串用戶名和電話號(hào)碼的列表,然后把查詢結(jié)果寫入共享對象。詳細(xì)的方法后面的章節(jié)會(huì)描述。
          創(chuàng)建和開發(fā)應(yīng)用程序的流程
          你可以使用FlashMX創(chuàng)作工具來創(chuàng)建應(yīng)用程序的客戶端組件,生成的swf文件提供了應(yīng)用程序的用戶界面,其中也包含了與FlashCom Server連接和控制的as腳本。
          服務(wù)器端則需要相關(guān)的應(yīng)用程序目錄,其中包含了運(yùn)行客戶端所需要的asc腳本,提供多個(gè)客戶端之間邏輯控制和數(shù)據(jù)交換。

          在開發(fā)應(yīng)用程序的過程種,客戶端程序需要發(fā)布到合適的位置以保證應(yīng)用程序的正常運(yùn)行,這通常要結(jié)合Web Server,如html、php、asp等,因?yàn)镕lashCom Server采用rtmp協(xié)議,所以web server并非必須,你可以直接在swf文件中執(zhí)行,但不推薦這樣做。
          服務(wù)器端程序(包含asc、flv等文件)需要放置到正確的應(yīng)用程序目錄下面。

          如果你是一個(gè)FlashCom Server管理員,你可以使用管理控制臺(tái)來配置FlashCom server、設(shè)置系統(tǒng)安全、監(jiān)視使用情況,停止和重啟server,還可以添加用戶。這需要用來第一章提到的 應(yīng)用程序管理器和管理工具


          應(yīng)用示例--FlashCom Develop閱讀筆記 (五)

          下面內(nèi)容主要講述如果用如何通過客戶端連接服務(wù)器,怎樣訪問共享對象,以及調(diào)用遠(yuǎn)程方法等。
          當(dāng)用戶使用客戶端的swf文件連接服務(wù)器時(shí),服務(wù)器會(huì)加載應(yīng)用程序,如果沒有運(yùn)行就創(chuàng)建實(shí)例。服務(wù)器端接受連接之后,產(chǎn)生一個(gè)新的客戶端對象回應(yīng)該客戶端應(yīng)用程序,執(zhí)行指定的服務(wù)器端腳本。客戶端需要做的是初始化數(shù)據(jù)流和共享對象等
          連接流程
          當(dāng)客戶端開始連接服務(wù)器后,服務(wù)器端會(huì)調(diào)用onAppStart方法(確保應(yīng)用程序?qū)嵗呀?jīng)處于運(yùn)行狀態(tài))
          接下來,服務(wù)器端會(huì)回調(diào)客戶端定義的onConnect方法,該方法的邏輯決定了是否接受該連接請求。當(dāng)客戶端斷開連接的時(shí)候,會(huì)調(diào)用服務(wù)器端的onDisconnect方法;當(dāng)應(yīng)用程序結(jié)束后,會(huì)調(diào)用onAppStop方法


          遠(yuǎn)程方法調(diào)用
          在連接成功之后,客戶端可以調(diào)用服務(wù)器端組件定義的方法,服務(wù)器端也可以調(diào)用客戶端組件中的方法。
          每一個(gè)連接到服務(wù)器端的應(yīng)用程序都作為一個(gè)服務(wù)器端的客戶對象實(shí)例,每一個(gè)客戶端的實(shí)例對象都可以通過NetConnect對象調(diào)用遠(yuǎn)程服務(wù)器的方法,然后服務(wù)器端可以回應(yīng)并返回值給客戶端。下面的圖表示了在客戶端調(diào)用服務(wù)器端方法并獲取返回值的方法:


          從服務(wù)器端回調(diào)客戶端的方法
          從服務(wù)器回調(diào)客戶端的方法比較類似于上面所說的。在客戶端,可以給NetConnect對象的實(shí)例自定義方法,在服務(wù)器端可以利用client.call的方式調(diào)用客戶端的方法。圖示即為從服務(wù)器調(diào)用客戶端并返回值的方法。


          共享對象的使用
          共享對象簡化了在多用戶之間共享數(shù)據(jù)的開發(fā)工作,一個(gè)Flash 客戶端要獲取遠(yuǎn)程共享對象可以通過 SharedObject.getRemote來指定連接,
          然后通過SharedObject.connect連接遠(yuǎn)程共享對象,一旦連接成功,服務(wù)器端會(huì)發(fā)送同步信息給各個(gè)連接的客戶端,客戶端使用SharedObject.onSync來保持同步,下面的圖簡單描述了其使用過程。

          對象概述--FlashCom Develop閱讀筆記 (六)

          第三章 使用對象
          Macromedia Flash Communication Server MX 1.5提供了兩部分API,即客戶端API和服務(wù)器端API。本章主要講述客戶端API和服務(wù)器端API是怎樣使用的。也會(huì)涉及到共享對象的討論,怎樣存儲(chǔ)關(guān)于應(yīng)用程序和用戶的相關(guān)信息。概述FlashMX Com Server的核心對象之后,我們也會(huì)重點(diǎn)描述一些類的細(xì)節(jié)內(nèi)容,例如Camera, Microphone, NetStream, Stream, System和 Video 對象以及關(guān)于如何優(yōu)化應(yīng)用程序、保護(hù)客戶端對象和使得NetConnection對象更安全。
          客戶端API提供了: Camera(攝影機(jī)), Microphone(麥克風(fēng)), NetConnection(聯(lián)機(jī)),NetStream(串流), SharedObject(共享對象)和 Video(視頻). 服務(wù)器端API提供了下面這些對象: Application(應(yīng)用程序), Client(客戶端), NetConnection(聯(lián)機(jī)), SharedObject(共享對象)和 Stream(串流).
          客戶端對象
          下面的對象只能用于客戶端的as腳本中
          Camera 對象:允許你從攝影機(jī)捕捉視頻并追加到任何一個(gè)MC中,當(dāng)使用FlashMx Com server的時(shí)候,還可以在聯(lián)機(jī)對象間傳輸、顯示,甚至錄制捕捉到的視頻。應(yīng)用這個(gè)特性,你可以開發(fā)例如視頻會(huì)議、視頻聊天等應(yīng)用程序。
          Microphone 對象 :該對象用于取得麥克風(fēng)的聲音來源,并且可以在聯(lián)機(jī)對象之間傳輸、播放等,可以開發(fā)例如語音聊天之類的應(yīng)用程序,如果不使用聯(lián)機(jī)對象,也可以把聲音通過音箱在本地輸出。
          NetConnection 對象:允許Flash客戶端通過TCP socket與FlashCom Server建立連接,并且使用RTMP(Real-
          Time Messaging Protocol,實(shí)時(shí)訊息通訊協(xié)議)交互數(shù)據(jù)。
          NetStream 對象:在使用Netconnect對象所建立的聯(lián)機(jī)對象上,進(jìn)行數(shù)據(jù)、聲音和視頻信息的傳輸,就如同NetConnect的通道一樣。
          可以使用NetStream.publish方法來發(fā)步數(shù)據(jù)流,使用NetStream.play來播放接收到的數(shù)據(jù)流。
          Localshared 對象:記錄用戶的資料,或者把訊息實(shí)時(shí)傳遞給所有聯(lián)機(jī)用戶。
          Video 對象:用于顯示通過NetStream.play方法或Camera.get方法捕捉到的視頻流。并通過Video.attachVideo方法把該視頻對象放置到flash的舞臺(tái)。
          服務(wù)器端對象
          Application 對象:包含應(yīng)用程序?qū)嶓w的信息與狀態(tài),直到程序結(jié)束為止。Application對象也可以讓程序決定是否接收用戶的聯(lián)機(jī)或者關(guān)閉用戶的聯(lián)機(jī),以及清除應(yīng)用程序特定的流、清除在服務(wù)器端的共享對象,并讓你在有效范圍內(nèi)訪問整個(gè)應(yīng)用程序的變量、定義相關(guān)事件所執(zhí)行的函數(shù)等。
          Client 對象:包含每個(gè)聯(lián)機(jī)用戶的信息,例如客戶端的IP地址、Flash的版本信息、分配用戶的頻寬,或者呼叫客戶端定義的方法等。
          NetConnection 對象:可以在應(yīng)用程序?qū)嶓w和服務(wù)器端,或者同一臺(tái)服務(wù)器的另外一個(gè)應(yīng)用程序之間創(chuàng)建一種雙向的連接。你甚至可以使用服務(wù)器端的 NetConnection 對象來創(chuàng)建更強(qiáng)大的應(yīng)用程序,例如你可以獲取天氣信息從另一個(gè)應(yīng)用程序服務(wù)器或者和其他的Flashcom服務(wù)器及應(yīng)用程序?qū)嶓w共享加載。使用聯(lián)機(jī)對象,你可以使用標(biāo)準(zhǔn)的http協(xié)議或者rtmp協(xié)議在服務(wù)器之間交互和傳遞數(shù)據(jù)。
          Remoteshared 對象:遠(yuǎn)程共享對象是在客戶端建立的,但是可以在服務(wù)器端仍然可以使用,它可以實(shí)時(shí)地在客戶端的多個(gè)應(yīng)用程序之間共享和存儲(chǔ)數(shù)據(jù)
          SharedObject對象:作用和客戶端建立的遠(yuǎn)程共享對象一樣,讓不同聯(lián)機(jī)用戶能夠通過服務(wù)器端的共享對象實(shí)時(shí)分享信息。不過所提供的方法和客戶端的有所區(qū)別。例如,讀取服務(wù)器端的共享對象要用get方法,設(shè)定存儲(chǔ)資料不用data屬性,而使用setproperty和getProperty方法,另外還有暫時(shí)鎖住和解鎖的方法lock和unlock,防止資料會(huì)覆寫。
          Stream 對象:處理影音串流,傳回錄像文件的時(shí)間秒數(shù)、呼叫客戶端串流對象中的自定義方法、以及播放與錄像等方法。
          客戶端和服務(wù)器端的對象交流
          某些對象的方法是可以在客戶端或者服務(wù)器端建立和相互調(diào)用。例如當(dāng)客戶端的NetConnect對象聯(lián)機(jī)到服務(wù)器端,服務(wù)器端的Netconnect對象同時(shí)也建立了,這個(gè)對象可以調(diào)用客戶端NetConnect對象的副本的所有方法。下面的表格顯示了對應(yīng)的調(diào)用關(guān)系
          1: 客戶端對象
          2: my_nc (NetConnection object)
          3: my_ns (NetStream object)
          4: my_so (remote shared object)
          5: 回應(yīng)的服務(wù)器端對象
          6: my_client (Client object or application.clients object)
          7: my_server_stream (Stream object)
          8: my_server_so (server-side shared object)
          9:
          下面表示了客戶端的調(diào)用和服務(wù)器端的回應(yīng)
          1:
          2: 客戶端的調(diào)用
          3: my_nc.connect
          4: my_nc.close
          5: my_nc.call('doThing', myCallbackFcn, 1, 'foo')
          6: my_so.send('doThing', 1, 'foo')
          7: 服務(wù)器端的回應(yīng)分別對應(yīng)為
          8: application.onConnect
          9: application.onDisconnect
          10: my_client.doThing(1, 'foo')
          11: my_server_so.doThing(1, 'foo')
          12:
          下面顯示了服務(wù)器端的調(diào)用和客戶端的回應(yīng)
          1:
          2: 服務(wù)器端的調(diào)用
          3: my_client.call ('doThing', myCallbackFcn,1, 'foo')
          4: my_server_stream.send ('doThing', 1,'foo')
          5: my_server_so.send('doThing', 1, 'foo')
          6: 客戶端的回應(yīng)分別對應(yīng)為
          7: my_nc.doThing (1, 'foo')
          8: my_ns.doThing (1, 'foo')
          9: my_so.doThing(1, 'foo')

          理解共享對象--FlashCom Develop閱讀筆記 (七)

          理解共享對象
          共享對象可以存儲(chǔ)任何Flash支持的數(shù)據(jù)類型。就存放位置來說,共享對象可以分成存在客戶端計(jì)算機(jī)的本地型,以及存放在服務(wù)器上的遠(yuǎn)程型。你可以用它來記錄用戶的相關(guān)信息(如用戶名、性別和其它設(shè)置參數(shù)等),或者用在服務(wù)器端,存儲(chǔ)其它聯(lián)機(jī)用戶實(shí)時(shí)分享的信息(如聊天室的內(nèi)容和線上用戶名單等)
          共享對象意味著用戶可以在不同的用戶之間、不同的同一臺(tái)服務(wù)器上的應(yīng)用程序?qū)嶓w。FlashCom server 支持三種不同的共享對象:Local、remote和server-side。下面簡單介紹下這三個(gè)共享對象。
          本地共享對象(Local shared object)
          用于存取本地的數(shù)據(jù),存儲(chǔ)在用戶的計(jì)算機(jī)硬盤中,并可以在不同的時(shí)間被其它應(yīng)用程序訪問。本地共享對象的擴(kuò)展名為.sol,默認(rèn)的存儲(chǔ)路徑是c:\documents and Settings\登錄名稱\Application Data\Macromedia\Flash Player\服務(wù)器網(wǎng)域名稱\影片路徑\影片文件名.swf\。本地共享對象也可以是短暫的,也就是說只有但應(yīng)用程序運(yùn)行時(shí)可用。我們也可以不連接Flashcom server而使用本地共享對象。更多的本地共享對象的信息,可以參考手冊中的SharedObject.getLocal方法。
          建立和存取本地共享對象的方法如下:
          1: var so= SharedObject.getLocal('myCookie') //建立本地共享對象
          2: //存儲(chǔ)資料
          3: //注意:不管是讀取還是寫入資料到本地共享對象,都必須通過data屬性。
          4: so.data.userName='liu21st';
          5: so.data.msg='世紀(jì)流年';
          6: so.data.counter=10;
          7: //在默認(rèn)狀態(tài)下,以上資料并不會(huì)馬上寫入用戶的磁盤,必須等到動(dòng)畫被關(guān)閉,或者用戶離開你的網(wǎng)站后,才會(huì)寫入磁盤。如果要立即寫入的話,必須使用flush方法。如下:
          8: so.flush();
          確認(rèn)資料是否存儲(chǔ)成功可以通過onstatus事件來獲取
          返回的code值為
          SharedObject.Flush.Success(寫入成功)
          SharedObject.Flush.Failed(寫入失敗)
          代碼示例:
          1: so.onStatus = function (info){
          2: var status=info.code;
          3: if (status=='SharedObject.Flush.Success'){
          4: ? trace('寫入成功'); }
          5: else trace('寫入失敗');
          遠(yuǎn)程共享對象(remote shared object)
          通過Flash影片的ActionScript程序,在服務(wù)器端建立能讓不同聯(lián)機(jī)用戶共同存取的資料,稱為遠(yuǎn)程共享對象。和本地共享對象一樣,遠(yuǎn)程共享對象可以被本地計(jì)算機(jī)存取,不同的是在資料存儲(chǔ)在服務(wù)器端,所以任何用戶都可以連接到遠(yuǎn)程共享對象訪問到相同的信息。默認(rèn)的存儲(chǔ)路徑是應(yīng)用程序?qū)嶓w路徑下的sharedobjects文件夾,擴(kuò)展名是.fso。
          遠(yuǎn)程共享對象也是最常用的共享對象類型。每當(dāng)聯(lián)機(jī)用戶(或服務(wù)器端程序)更新遠(yuǎn)程共享對象的內(nèi)容,其它聯(lián)機(jī)到相同應(yīng)用程序?qū)嶓w的用戶將自動(dòng)收到更新內(nèi)容的事件(onSync),保持彼此資料的同步。聊天室應(yīng)用程序就是運(yùn)用這個(gè)機(jī)制建立的。
          例如,你可以打開一個(gè)遠(yuǎn)程共享對象,如電話號(hào)碼表(在服務(wù)器端持久有效)。當(dāng)用戶端對該共享對象作任何更改的時(shí)候,修改后的數(shù)據(jù)對其他連接到該遠(yuǎn)程共享對象的用戶是自同步的。如果因?yàn)槟撤N原因,更新了本地的數(shù)據(jù)信息但是沒有連接到服務(wù)器,那么所作的更改會(huì)在下一次連接到服務(wù)器的時(shí)候同步遠(yuǎn)程共享對象。
          更多的信息可以參考手冊中的SharedObject.getRemote方法。
          建立遠(yuǎn)程共享對象的方法:
          1: var client_nc = new NetConnection();
          2: client_nc.connect('rtmp://localhost/videochat/room1');
          3: so = SharedObject.getRemote('records',client_nc.url);//數(shù)據(jù)資料不寫入磁盤
          4: so.connect(client_nc);
          遠(yuǎn)程共享對象的數(shù)據(jù)讀取和寫入方法和本地共享對象類似,也是通過data屬性和flush方法。
          使用下面語句可以把數(shù)據(jù)資料寫入服務(wù)器端應(yīng)用程序文件夾共享對象目錄
          1: so = SharedObject.getRemote('records',client_nc.url,true);
          2:
          當(dāng)遠(yuǎn)程共享對象的內(nèi)容改變或者初次聯(lián)機(jī)時(shí),它都會(huì)向客戶端發(fā)出onsync (同步)事件,好讓所有聯(lián)機(jī)用戶都能實(shí)時(shí)取得最新的共享對象資料。
          示例代碼:
          1: so.onSync = function(list) {
          2: for (var k in list) {
          3: trace('name = ' + list[k].name + ', event = ' + list[k].code);
          4: }
          5: // do whatever else you want to do here
          6: }
          代理共享對象(proxied shared object)
          代理共享對象是可以在用戶端和服務(wù)器端共享的一種遠(yuǎn)程共享對象,區(qū)別在于它是由服務(wù)器端的ActionScript程序建立的,例如,在服務(wù)器端有兩個(gè)聊天室的實(shí)體chat01和chat02,在chat02中可以連接到在chat01中定義的共享對象,更多的信息可以參考手冊的SharedObject.get方法。
          和客戶端的sharedobject不同,設(shè)置共享變量的值要通過 SharedObject.setProperty,取得共享變量的值通過 SharedObject.getProperty 。
          實(shí)例代碼:
          1: application.appStart = function() {
          2: ? ? nc = new NetConnection();
          3: ? ? nc.connect('rtmp://' + master_server + '/' + master_instance);
          4: ? ? proxySO = SharedObject.get('myProxy',true,nc); ?
          5: ? // Now, whenever the client asks for a persistent
          6: ? // shared object called myProxy they will receive myProxy
          7: ? // shared object from the master_server/master_instance
          8: };
          1: myInfo = SharedObject.get('foo');
          2: var addr = myInfo.getProperty('address');
          3: myInfo.setProperty('city', 'San Francisco');
          4: var names = sharedInfo.getPropertyNames();
          5: for (x in names){
          6: ? var propVal = sharedInfo.getProperty(names[x]);
          7: ? trace('Value of property ' + names[x] + ' = ' + propVal);
          8: }
          在使用遠(yuǎn)程共享對象之前,請確認(rèn)SharedObject.connect 返回 true,在客戶端調(diào)用SharedObject.flush 方法只是在本地拷貝了一份,要確保服務(wù)器端的拷貝,必須在服務(wù)器端使用SharedObject.flush 方法,如:
          1: // Sample server-side code for flushing a persistent shared object
          2: // to the server
          3: // Get the shared object when the application is loaded.
          4: application.onAppStart = function()
          5: {
          6: application.mySO = SharedObject.get('SharedObjName', true);
          7: }
          8: // When a user disconnects, flush the shared object.
          9: application.onDisconnect = function(client)
          10: {
          11: application.mySO.flush();
          12: }
          如果在同一時(shí)間有多個(gè)客戶端或者服務(wù)器端在同步遠(yuǎn)程共享對象的話,就會(huì)出現(xiàn)問題,要解決這個(gè)沖突可以通過下面的方法。
          1. 使用不同的位置存儲(chǔ)不同用戶的信息
          這是最簡單的一種方法,例如,在聊天室給每個(gè)用戶不同的位置存放數(shù)據(jù),同步只修改自己的數(shù)據(jù)部分。
          2. 分配資料所有者
          復(fù)雜一點(diǎn)的方法就是定義一個(gè)用戶為有限的時(shí)間內(nèi)該數(shù)據(jù)資料的所有者,所有者可以鎖定服務(wù)器端的共享對象,直到返回可用信息后方可同步另外的數(shù)據(jù)。下面是示例代碼:
          通過一個(gè)記錄游戲最高分的應(yīng)用程序來說明解決同步?jīng)_突的問題,當(dāng)前系統(tǒng)保存的最高分是95,同時(shí)有兩個(gè)用戶打破了這個(gè)記錄,成績分別為105和110,如果不鎖定最高分的話,兩個(gè)成績都會(huì)同時(shí)執(zhí)行updateHighScore方法,有可能其中一個(gè)成績會(huì)無法記錄下來。使用鎖定共享對象的方法解決了這樣一個(gè)問題。
          1: application.onAppStart = function()
          2: {
          3: application.scoreSO = SharedObject.get('high_score_so', true);
          4: application.scoreSO.onSync = function(listVal)
          5: {
          6: trace('got an onSync on scoreSO');
          7: }
          8: }
          9: application.onConnect = function(newClient,name,passwd)
          10: {
          11: newClient.updateHighScore = function(final_score)
          12: {
          13: application.scoreSO.lock();
          14: if (application.scoreSO.getProperty('high_score_so') < final_score)
          15: {
          16: application.scoreSO.setProperty('high_score_so', final_score);
          17: }
          18: application.scoreSO.unlock();
          19: }
          20: }
          3. 通知客戶端
          當(dāng)服務(wù)器端收到客戶端的同步請求的時(shí)候,SharedObject.onSync事件會(huì)通知用戶端更改被拒絕,然后提供一個(gè)用戶界面來給用戶解決這種沖突。這種技術(shù)通常用于客戶端不是經(jīng)常更新的情況。
          4. 接受某些,拒絕其它的
          應(yīng)用程序根據(jù)“先到先服務(wù)”的原則來解決同步的沖突問題。通常需要于客戶自己重新請求來解決沖突。
          5. 通過send方法來提高控制級(jí)別
          SharedObject.send 命令給所有連接到該遠(yuǎn)程共享對象的客戶端廣播消息,也包括發(fā)送者本人。
          獲取peoplelist值的方法
          要獲取FlashCom的peoplelist組件的值,可以用下面的方法:
          1: yourComponent.people_lb.getValue();
          以上方法可以實(shí)現(xiàn)點(diǎn)擊用戶列表中某人進(jìn)行相關(guān)操作等等~
          設(shè)置用戶列表組件的顏色
          在用戶列表組件上按右鍵選擇 edit in place 然后解除people_lb層的鎖定,并再次點(diǎn)擊右鍵選擇 edit in place 在第一幀的Actionscript底部找到下面這段:
          1 : var frogStyle = new FStyleFormat();
          2 :
          3 : frogStyle.textColor = '0x666666';
          4 : frogStyle.textSelected = '0x333333';
          5 : frogStyle.textDisabled = '0x333333';
          6 : frogStyle.selection = '0xbefdff';
          7 : frogStyle.selectionUnfocused = '0xd8feff';
          8 : frogStyle.backgroundDisabled = '0xffffff';
          9 : frogStyle.addListener(this);
          修改相關(guān)的顏色值就可以了
          SimpleConnect組件登錄的問題
          因?yàn)槟J(rèn)的SimpleConnect組件并沒有驗(yàn)證用戶的功能,如果要驗(yàn)證用戶的話,可以通過和PHP、ASP等后臺(tái)程序結(jié)合。但是用戶名和房間名稱怎樣帶入聊天室呢?
          找到simpleconnect組件,在最下面有默認(rèn)的連接方式
          1: this.serverConnect(_parent.username, _parent.appInstance);
          含義就是獲取上一級(jí)(這里就是瀏覽器傳遞過來的)的變量,其實(shí)我們可以在swf文件后面直接帶參數(shù)來執(zhí)行也是可以的,如下:
          1: videochat.swf?username=liu21st&appInstance=room1
          但是一般不建議這樣做,因?yàn)檫@樣仍然無法進(jìn)行程序的驗(yàn)證。
          采用的方式可以是用php等后臺(tái)程序進(jìn)行驗(yàn)證后(或者在flash文件中調(diào)用php來進(jìn)行驗(yàn)證)后用存入會(huì)話
          然后在swf的調(diào)用方式按照下面方法增加變量(以PHP為例)
          1: <PARAM NAME=movie VALUE='Chat.swf'>
          2: <PARAM NAME=FlashVars VALUE='username=<?=$_SESSION['UserName']?>&userID=<?= $_SESSION['UID']?>&appInstance=<?=$_SESSION['AppInstance']?>'>
          通過這種方式可以傳遞你需要的變量到flash中,注意不要忘記增加相應(yīng)的embed標(biāo)記。
          如果不要讓用戶看到這個(gè)傳入值,可以把變量存到flash的變量中,然后改變服務(wù)器simpleconnect連接參數(shù):
          1: this.serverConnect(_root.username, _root.appInstance);
          一個(gè)簡單的聊天系統(tǒng)
          用function組件實(shí)現(xiàn)一個(gè)簡易聊天室,大家可以試用下。
          私聊組件的命令模式問題
          最近在使用中發(fā)現(xiàn) peldi 的私聊組件在執(zhí)行消息命令的時(shí)候,經(jīng)常會(huì)顯示出來命令。今天改造了一下,去掉了命令模式,改用按鈕的方式來實(shí)現(xiàn)清屏、踢人和禁止功能。
          實(shí)現(xiàn)思路如下:改造peoplelist組件和服務(wù)器端的共享變量存儲(chǔ)。增加userId、userSex和userIp存儲(chǔ)
          1: application.user_so.setProperty(clocal.id,{ id:userId,name:username,sex:userSex,ip:userIp });
          在people_lb的listbox組件中同步的時(shí)候addItem改成
          1: people_lb.addItem(this.data[ i ].name+this.data[ i ].sex,this.data[ i ].ip)
          然后在操作的時(shí)候先點(diǎn)選用戶列表中某個(gè)用戶,通過getValue() 來去得其IP地址,調(diào)用服務(wù)器端的相關(guān)方法來實(shí)現(xiàn)清屏、踢人和禁止功能。
          新版視頻聊天室測試中~
          今天差不多完成了公司新版視頻聊天室的改造工作。
          表面上似乎差不多,內(nèi)部組件重寫了不少。
          主要改進(jìn)了:
          1 聊天室的管理命令改為按鈕形式,避免了經(jīng)常在聊天記錄中顯示管理命令的Bug
          2 改變私聊方式,增加對某人聊天
          3 改變統(tǒng)計(jì)在線用戶數(shù)的方法,避免用戶非正常退出的數(shù)據(jù)庫寫入問題
          4 改進(jìn)了聊天歷史記錄文字框的顯示方式
          不過,目前仍然處于測試階段,注冊免費(fèi)使用,有興趣的朋友可以繼續(xù)關(guān)注!

          可以從這里進(jìn)去:[ http://twbbs.idv.to ] 選擇左邊的聊天室就可以了。
          擴(kuò)展people_list組件
          Flashcom自帶的people_list組件功能不足,我之前做的聊天室也只是加了用戶性別的文本標(biāo)識(shí),這里講了有關(guān)添加圖片的方法
          [ 查看 ]
          fb3有一個(gè)實(shí)現(xiàn)的方法:
          [ 點(diǎn)這里查看 ]
          其實(shí)現(xiàn)方法如下:
          1: this.people_lb.setItemSymbol('FPLCustomItem');
          2: globalStyleFormat.textAlign = 'center';
          3: globalStyleFormat.applyChanges();
          在新版的組件中似乎可以用iconFunction 來設(shè)置。
          SmileyTextField component的問題
          SmileyTextField component組件在flashMX2004中發(fā)布為flash7的時(shí)候,表情符號(hào)的顯示位置總是在第一行。奇怪的是該組件自帶的范例卻是運(yùn)行正常的 。自己做的時(shí)候怎么都不行,而且清空的時(shí)候也不能正確清除表情圖標(biāo)。研究了一整天,找到了問題所在
          在SmileyTextFieldClass.prototype.parseString函數(shù)中找到
          1: this.line += this.line == undefined? 0: 1;
          把它刪除或者注釋掉
          換成下面的代碼:
          1: if (this.line == undefined) { this.line = 0; } else { this.line +=1; }
          才能保證表情符號(hào)的位置行正確。
          如果不知道SmileyTextField component是什么


          Application對象--FlashCom Develop閱讀筆記 (八)

          Application對象可以讓你接受或拒絕用戶端的連接請求,注冊客戶端相應(yīng)事件的類和方法等。一般在服務(wù)器端的main.asc文件中定義相關(guān)事件。
          服務(wù)器端的程序由下列事件程序組成:
          1 : application.onAppStart = function(){
          2 : //應(yīng)用程序初次啟動(dòng)時(shí),要執(zhí)行的程序
          3 : //并且只會(huì)被執(zhí)行一次
          4 : }
          1 : application.onConnect = function(){
          2 : //每當(dāng)有用戶鏈接到此應(yīng)用程序時(shí),要執(zhí)行的程序
          3 : //可以在這里讀取用戶端的數(shù)據(jù)
          4 : //建立可以讓客戶端執(zhí)行的方法
          5 : //或者呼叫客戶端的自定義方法等
          6 : }
          如果使用communication server組件的話,還可以使用Application.onConnectAccept 和 application.onConnectReject事件
          可以查看下面的實(shí)例程序:
          01 : // A user has connected
          02 : application.onConnect = function( newClient, userName )
          03 : {
          04 : if (userName == 'admin')
          05 : {
          06 : newClient.adminFunc= function(param)
          07 : {
          08 : // some code that’s only useful to the admin
          09 : newClient.myAdminProperty = param;
          10 : }
          11 : } else
          12 : {
          13 : // code for most cases
          14 : }
          15 : // Allow the logon
          16 : application.acceptConnection( newClient );
          17 : }
          18 : // this part could be in a separate file
          19 : // Every client (including admin) is going to have this function
          20 : // (because of the way 'prototype' works).
          21 : Client.prototype.commonFunction = function (myColor)
          22 : {
          23 : // some code
          24 : // use this to refer to the client instead of newClient
          25 : this.color = myColor;
          26 : }
          或者
          01 : application.onConnect = function(clientObj,name,passwd)
          02 : {
          03 : // First accept the connection
          04 : application.acceptConnection(clientObj);
          05 : // After client is registered with the application instance
          06 : // you can use 'call' method
          07 : clientObj.call('onWelcome', 'You are now connected!!!');
          08 : return;
          09 : // Once you call acceptConnection or
          10 : // rejectConnection within onConnect, return value is ignored.
          11 : }
          注意:如果要call客戶端的方法,請確認(rèn)已經(jīng)調(diào)用application.acceptConnection以保證客戶端正常連接。
          1 : application.onDisConnect = function(){
          2 : //當(dāng)用戶離線時(shí),要執(zhí)行的程序
          3 : //可以在這里清楚用戶的數(shù)據(jù)
          4 : //和其它相關(guān)的程序
          5 : }
          可以參考下面的程序:
          01 : // On the server side you would have the following
          02 : application.onConnect = function(newClient, name)
          03 : {
          04 : newClient.name = name;
          05 : return true;
          06 : }
          07 : application.onDisconnect = function(client)
          08 : {
          09 : for (var i = 0; i < application.clients.length; i++)
          10 : {
          11 : application.clients[ i ].call('userDisconnects', client,name);
          12 : }
          13 : }
          14 : // On the client side you would have the following
          15 : nc = new NetConnection();
          16 : nc.userDisconnects= function (name) {
          17 : trace(name + 'quits');
          18 : }
          19 : nc.connect ('rtmp:/app_name', userName);
          1 : application.onAppStop = function(){
          2 : //應(yīng)用程序結(jié)束時(shí),要執(zhí)行的程序
          3 : //也就是說所有的聯(lián)機(jī)用戶都離線后
          4 : //這里的程序會(huì)被執(zhí)行
          5 : }
          我們看到的main.asc文件可能并沒有包含上面的任何一個(gè)事件,那是因?yàn)橛锌赡芡ㄟ^load方法加載了其它的組件定義,但是我們?nèi)匀豢梢栽趍ain.asc文件中定義我們需要的事件和方法。
          關(guān)于文本聊天的表情
          之前一直為FlashCom的chat組件文字聊天的表情問題煩惱,網(wǎng)上也看過很多的解決方案,都比較難操作,這個(gè)是實(shí)現(xiàn)的最好的,也比較容易使用。站長推薦~
          如果無法下載的話,提供本地下載:[ up/1089688115.zip ]
          更完整的實(shí)現(xiàn)可以參考:Dart
          一個(gè)用 Flash MX/PHP/MySQL 實(shí)現(xiàn)的聊天系統(tǒng)。


          Camera對象--FlashCom Develop閱讀筆記 (九)

          這一節(jié)主要講述camera對象的使用,包括camera的使用優(yōu)化、設(shè)置合適的帶寬和如果使得一個(gè)camera用于多個(gè)應(yīng)用程序。
          Camera對象允許你從攝影機(jī)捕捉視頻并追加到任何一個(gè)MC中,當(dāng)使用FlashMx Com server的時(shí)候,還可以在聯(lián)機(jī)對象間傳輸、顯示,甚至錄制捕捉到的視頻。應(yīng)用這個(gè)特性,你可以開發(fā)例如視頻會(huì)議、視頻聊天等應(yīng)用程序。當(dāng)然你也可以不通過服務(wù)器來使用Camera對象,例如可以捕捉你的視頻并附加到某個(gè)MC。
          Camera常用的屬性:
          1: bandWidth 每秒種傳送的最大字節(jié)數(shù)
          2: currentFps 當(dāng)前傳送的fps值
          3: fps setMode方法設(shè)定的fps值
          4: name 當(dāng)前使用的攝像機(jī)名稱
          5: names 可用視頻捕捉設(shè)備的數(shù)組
          6: index 可以視頻設(shè)備的索引值
          7: keyFrameInterval 關(guān)鍵幀間隔
          8: loopback 是否壓縮影像
          9: motionLevel 靈敏度0~100 數(shù)值越高動(dòng)作越遲鈍
          10: width 影像的寬度
          11: height 影像的高度
          12: quality 傳送的影像品質(zhì)0~100
          13: muted 客戶端是否允許Flash取用本地端的攝像機(jī)
          需要?jiǎng)?chuàng)建Camera對象,使用下面代碼:
          1 : MyCamera = Camera.get();
          2 : //如果有多個(gè)視頻設(shè)備,請使用index(索引值)指定設(shè)備
          3 : MyCamera = Camera.get(index);
          4 :
          如果在不同的網(wǎng)域訪問,就會(huì)彈出窗口讓用戶確認(rèn)使用或是拒絕使用:

          當(dāng)用戶對彈出窗口響應(yīng)后就會(huì)觸發(fā)onStatus事件,請參考muted參數(shù)
          當(dāng)然也可以記住用戶的選擇,點(diǎn)擊鼠標(biāo)右鍵出現(xiàn)設(shè)置窗口

          在該窗口選擇允許,并選中記住,下次就不會(huì)彈出確認(rèn)窗口了。
          更高級(jí)的示例是彈出設(shè)備選擇窗口讓用戶選擇:
          1 : camArray = Camera.names;
          2 : if (camArray.length == 1){
          3 : Camera.get();
          4 : }
          5 : else
          6 : System.showSettings(3);//彈出視頻設(shè)置窗口
          7 : Camera.get();

          Flashcomguru 的 arckid 提供了一個(gè)很好的檢測Camera的方法,把它略作修改如下
          01 : function checkforCam() {
          02 : camArray = Camera.names;
          03 : if (camArray.length >= 1){
          04 : temp_cam = Camera.get();
          05 : if(temp_cam == -1)
          06 : trace('視頻設(shè)備正忙');
          07 : else
          08 : trace('視頻設(shè)備可用');
          09 : delete temp_cam;
          10 : } else if (camArray.length == 0) {
          11 : trace('沒有視頻設(shè)備');
          12 : }
          13 : }
          14 : //-----------------------------------------------------------------
          15 : //或者下面的函數(shù)更精簡:
          16 : function checkForCam(){
          17 : return Camera.names.length;
          18 : }
          19 : function isCamBusy(){
          20 : if(arguments.length) return Camera.get(arguments[0]) == -1;
          21 : return Camera.get() == -1;
          22 : }
          23 :
          要設(shè)置Camera對象的模式,可以用setMode()方法,如下:
          1 : MyCamera.setMode(width, height, fps [, favorSize])
          2 : //width,height 是Camera對象寬高,默認(rèn)值是160×120
          3 : //fps 捕捉視頻的速率 默認(rèn)值是15
          4 : //favorSize 是一個(gè)可選的布爾值,默認(rèn)為true,表示采用最大匹配當(dāng)前的窗口大小的速率,如果設(shè)為false,則會(huì)優(yōu)先考慮影像的流暢度。
          不同帶寬的建議設(shè)置
          默認(rèn)的Camera設(shè)置對所有的帶寬提供了一個(gè)相同的足夠好的傳輸品質(zhì),如果需要手動(dòng)設(shè)置以適應(yīng)不同的帶寬要求,設(shè)置Camera參數(shù)的方法如下:
          1: MyCamera.setQuality(bandwidth, frameQuality)
          2: //bandwidth 頻寬指每秒傳送的最大字節(jié)數(shù) 默認(rèn)為16384 如果設(shè)為0則維持frameQuality設(shè)定的影像品質(zhì),盡量使用最大頻寬
          3: //freamQuality 影像的壓縮品質(zhì)1~100,設(shè)為0表示在bandwidth設(shè)定范圍內(nèi)自動(dòng)調(diào)整影像品質(zhì)
          4:
          下面對不同的帶寬給出了建議設(shè)置:
          1: [ Modem ]
          2: 較低畫質(zhì),較高動(dòng)作流暢度 my_cam.setQuality(4000,0)
          3: 較高畫質(zhì),較低動(dòng)作流暢度 my_cam.setQuality(0,65)
          4: [ DSL ]
          5: 較低畫質(zhì),較高動(dòng)作流暢度 my_cam.setQuality(12000,0)
          6: 較高畫質(zhì),較低動(dòng)作流暢度 my_cam.setQuality(0,90)
          7: [ LAN ]
          8: 較低畫質(zhì),較高動(dòng)作流暢度 my_cam.setQuality(400000,0)
          9: 較高畫質(zhì),較低動(dòng)作流暢度 my_cam.setQuality(0,100)
          打開和設(shè)置完Camera之后后要附加到一個(gè)視頻實(shí)體才可以顯示
          1: MyVideo.attachVideo(MyCamera);
          正常關(guān)閉camera
          如果你的應(yīng)用程序使用camera對象和NetStream對象記錄數(shù)據(jù),camera仍然保持打開狀態(tài),為了確保關(guān)閉Camera對象,請?jiān)诮Y(jié)束的時(shí)候使用
          1: NetStream.attachVideo(false)
          在多個(gè)應(yīng)用程序中使用同一個(gè)Camera
          多個(gè)應(yīng)用程序(swfs)可以在同時(shí)使用一個(gè)Camera。一般而言,多個(gè)瀏覽器窗口使用相同的進(jìn)程,所以在瀏覽器環(huán)境中多個(gè)應(yīng)用程序可以正常使用同一個(gè)Camera。但是,如果一個(gè)是在瀏覽器中運(yùn)行,一個(gè)是獨(dú)立應(yīng)用程序,就不能共享使用同一個(gè)Camera,因?yàn)镃amera不能被多個(gè)進(jìn)程共享。
          事件響應(yīng)
          在Camera有兩個(gè)重要的事件響應(yīng)
          1. onStatus事件 muted屬性變化會(huì)觸發(fā)該事件
          原參考手冊中的一個(gè)示例可以說明onstatus的用法
          01 : myCam = Camera .get ();
          02 : myVideoObject.attachVideo(myCam);
          03 : myCam.onStatus = function ( infoMsg ) {
          04 : if ( infoMsg.code == 'Camera.Muted' )
          05 : {
          06 : trace ( 'User denies access to the camera' );
          07 : }
          08 : else
          09 : trace ( 'User allows access to the camera' );
          10 : }
          11 : // Change the Allow or Deny value to invoke the function
          12 : System .showSettings(0);
          2. onActivity事件 視頻是否活動(dòng)的事件響應(yīng)
          請參考原手冊的范例:
          1 : // Assumes a Video object named 'myVideoObject' is on the Stage
          2 : c = Camera.get();
          3 : myVideoObject.attachVideo(c);
          4 : c.setMotionLevel(10, 500);
          5 : c.onActivity = function (mode)
          6 : {
          7 : trace(mode);
          8 : };


          Microphone對象--FlashCom Develop閱讀筆記 (十)

          這一節(jié)講述如何使用Microphone對象,包括怎么減少麥克風(fēng)的回音。

          獲取麥克風(fēng)
          1 : Microphone.get([index]);
          2 : //一般如果只有一個(gè)麥克風(fēng)的話,可以用Microphone.get()

          來自flashcomguru forums的檢測麥克風(fēng)函數(shù):
          01 : function checkforMic() {
          02 : micArray = Microphone.names;;
          03 : if (micArray.length >= 1){
          04 : temp_mic = Microphone.get();
          05 : if(temp_mic == -1)
          06 : trace( '--- mic is detected but its busy' );
          07 : else
          08 : trace( '--- mic detected' );
          09 : delete temp_mic;
          10 : } else if (micArray.length == 0) {
          11 : trace( '--- no Mic detected' );
          12 : }
          13 : }
          14 :

          或者使用下面的更簡單的函數(shù):
          01 : function checkForMic(){
          02 : return Microphone.names.length;
          03 : }
          04 :
          05 : // trace ('User have a Mic? -> '+checkForMic());
          06 :
          07 : function isMicBusy(){
          08 : if(arguments.length) return Microphone.get(arguments[0]) == -1;
          09 : return Microphone.get() == -1;
          10 : }
          11 : // trace ('Is user's Mic busy? -> '+isMicBusy());


          避免回音
          如果你使用外置的話筒,因?yàn)闀?huì)有較大的增益,就不可避免的遇到回音的問題。
          為了盡量降低話筒的回音,F(xiàn)lashCom Server提供了回音抑制功能。要使用這一功能,可以通過下面的方法:
          1: myMicrophone.useEchoSuppression(true);

          這樣就可以保持較好的語音效果,而不會(huì)從話筒傳遞過多的的回音。但盡管如此,仍然會(huì)有部分的回音無法消除,下面是一些好的建議:
          1. 適當(dāng)調(diào)低你的話筒音量
          2. 讓話筒遠(yuǎn)離你的音箱
          3. 及時(shí)查找你的設(shè)備故障
          4. 如果可以盡量使用戴在頭上的耳機(jī)或聽筒

          保持Microphone始終打開
          為了節(jié)約帶寬,F(xiàn)lashCom server默認(rèn)會(huì)關(guān)閉Microphone對象當(dāng)它不再使用的時(shí)候。但是,有時(shí)候你可能需要保持Microphone保持始終打開(例如為了保證沒有任何延遲),你可以使用下面的方法:
          1: my_mic.setSilenceLevel(0)


          音量調(diào)節(jié)
          Flashcomguru上提供了如何調(diào)節(jié)音量的方法:
          1 : //Attach your netstream audio to a movielcip:
          2 : movieclip_mc.attachAudio(yournetStream);
          3 : // create a sound object
          4 : my_snd = new Sound(movieclip_mc);
          5 : // to adjust the volume
          6 : my_snd.setVolume(50);
          服務(wù)器端計(jì)算在線人數(shù)的方法
          最簡單的計(jì)算在線人數(shù)的方法
          通過 application.clients.length 就可以了
          客戶端需要的話可以call服務(wù)器端定義的函數(shù),最方便的還是使用共享對象來存取了,下面給出完整的實(shí)現(xiàn)方法。
          在服務(wù)器端的main.asc文件中寫入:
          01 : application.onAppStart = function() {
          02 : this.users_so = SharedObject.get('users_so');
          03 : };
          04 :
          05 : application.onConnect = function(newClient, name)
          06 : {
          07 : // Accept the client's connection
          08 : application.acceptConnection(newClient);
          09 : i = application.clients.length;
          10 : this.users_so.setProperty('users', i);
          11 : }
          12 : application.onDisconnect = function(client)
          13 : {
          14 : i = application.clients.length;
          15 : this.users_so.setProperty('users', i);
          16 : }
          在客戶端fla文件中添加:
          1 : users_so = SharedObject.getRemote('users_so', client_nc.uri, false);
          2 : // 更新在線用戶數(shù)
          3 : users_so.onSync = function(list) {
          4 : txtNumberUsers.text = users_so.data.users;
          5 : }
          簡單的視頻聊天室,歡迎測試
          一個(gè)改進(jìn)版的視頻聊天室,目前功能還需完善。主要作了私聊方式的改進(jìn)(直接在用戶列表中選擇),和踢人和禁止功能等通過按鈕實(shí)現(xiàn)(需要管理員權(quán)限)。
          2004-08-19:修改了視頻私聊部分,自動(dòng)顯示自己的視頻,選擇用戶列表中的用戶查看視頻。
          2004-08-11:增加用戶列表圖標(biāo)功能,檢查用戶是否有攝像頭和性別(但目前boblog用戶注冊沒有填寫性別,故暫時(shí)沒有判斷),添加部分Flash支持的UBB標(biāo)識(shí)
          2004-07-30:增加聊天表情功能,使用smilyTextField 組件,并修正了中文的沖突和定位問題,歡迎使用!
          2004-07-12:Boblog1.5版增加了注冊功能后,注冊用戶可以直接登錄聊天室。
          有攝像頭的可以直接點(diǎn)視頻窗口打開視頻。
          2004-07-11:取消管理員登錄功能,自動(dòng)判斷用戶級(jí)別。
          有任何建議可以在此提出!
          注意:需要注冊網(wǎng)站用戶才可以登錄聊天室。 點(diǎn)這里注冊
          [目前在服務(wù)器端作了限制,該聊天室最多可同時(shí)10個(gè)連接。]
          點(diǎn)擊新窗口查看此Flash
          關(guān)于SmileyTextField組件的又一問題
          之前有提到過該組件無法正常顯示表情圖片的位置(總是顯示在第一行),但是當(dāng)把該組件集成到FlashCom的chat組件中時(shí)候,卻有另外一個(gè)問題出現(xiàn),表情圖片Y位置有向下的偏移,而且越來越多,這個(gè)問題困擾我好久。也嘗試過許多方法,今天終于找出問題的所在。
          組件action的第550行有如下代碼:
          1 : if ((tag_type == 'br' && str_array[0].length == 2) || (tag_type == 'p' && str_array[0].length == 1)) {
          2 : this.pixel_pos = 0;
          3 : this.line++;
          4 : if (this.cutLine != this.line - 1) this.cutPos = i;
          5 : this.smiley_mc_array[this.line] = new Array();
          6 : }
          問題就出在這行:
          1 : this.line++;//
          因?yàn)镕lashCom的chat組件在服務(wù)器段發(fā)送信息的時(shí)候會(huì)在每條信息最后加上
          標(biāo)記,這是正確的,但是表情符號(hào)是在客戶端解析的,因?yàn)樯厦娴某绦蛴龅絙r標(biāo)記時(shí)候會(huì)增加行數(shù)(因?yàn)楠?dú)立程序的換行標(biāo)記是該組件添加了,沒有考慮到系統(tǒng)會(huì)自動(dòng)加換行標(biāo)記 ),而這樣的話,表情符號(hào)就和文字內(nèi)容的垂直位置就有偏移了。
          以上內(nèi)容希望對使用SmileyTextField組件的朋友有所獲益~如有問題,歡迎大家一起討論!
          2004-07-20 發(fā)現(xiàn)一個(gè)問題,在次補(bǔ)正。
          1 : //經(jīng)過以上修改后
          2 : this.smiley_mc_array[this.line] = new Array();
          3 : //上面這行要修改為,否則表情符號(hào)無法正常清空
          4 : this.smiley_mc_array[this.line+1] = new Array();


          NetConnect對象--FlashCom Develop閱讀筆記 (十一)

          NetConnect對象--FlashCom Develop閱讀筆記 11
          站長注:好久沒有寫這個(gè)了,從這篇開始我不會(huì)單純的去翻譯英文手冊(其實(shí)本來就不是的,呵呵~再說都有現(xiàn)成的中文參考手冊了),而會(huì)綜合我個(gè)人的心得或者其它方面的參考資料。因?yàn)檫@些官方手冊的中文版遲早都會(huì)出來,大家會(huì)看的更清楚。但是有些內(nèi)容卻是手冊中沒有或者沒有講明白的,我想著重會(huì)寫這些,這也是我會(huì)持續(xù)寫下去的原因。因?yàn)闀r(shí)間原因,這些筆記都會(huì)及時(shí)補(bǔ)充,所以大家可以多多查看是否有更新的內(nèi)容。也希望大家多多支持!

          對象簡介
          如果要把本地端的視頻或者聲音傳遞給其它的客戶端,F(xiàn)lash影片就必須要聯(lián)機(jī)到FlashCom 服務(wù)器。聯(lián)機(jī)的方法就是通過NetConnect對象的connect()方法,連接到指定路徑的FlashCom應(yīng)用程序。
          FlashCom使用RTMP協(xié)議來共享和傳輸你的數(shù)據(jù)、聲音和視頻。

          對象屬性:
          isConnected 是否連接
          uri 連接的URL地址,可以使用下面的方式
          ? rtmp://www.myCompany.com/myMainDirectory/groupChatApp/HelpDesk
          ? rtmpt:/sharedWhiteboardApp/June2002
          ? rtmp::1234/chatApp/room_name

          例如你要聯(lián)機(jī)到vchat的聊天程序,并且進(jìn)入room1房間,可以按照下面的方式寫:
          1 : //建立聯(lián)機(jī)對象
          2 : client_nc = new NetConnect ();
          3 : //聯(lián)機(jī)到應(yīng)用程序?qū)嶓w
          4 : client_nc.connect( 'rtmp://mywebsite.com/vchat/room1' );

          可以不寫房間名,則進(jìn)入默認(rèn)的房間
          詳細(xì)的連接語法可以參考我之前的筆記:連接示例 。

          NetConnect對象并不支持http協(xié)議,所以類似下面的連接方式是錯(cuò)誤的:
          1: myConn.connect('http://www.mydomain.com/myfile.php?id= 0001') ;

          并且FlashCom服務(wù)器端不支持任何直接遠(yuǎn)程調(diào)用的方法如 getURL 或 LoadVars,也就是說,服務(wù)器端不能夠和后臺(tái)程序進(jìn)行數(shù)據(jù)交換,必須使用call方法調(diào)用客戶端方法或者使用FlashRemote(或者使用開源的PHPObject)。

          遠(yuǎn)程呼叫
          如果要呼叫遠(yuǎn)程服務(wù)器端的方法或指令,可以使用Call方法,該方法的格式如下:
          1 : call (方法名稱,接收傳回值的對象(沒有就用null),[參數(shù)1,參數(shù)2,...])
          2 : //參數(shù)列表為需要傳遞到服務(wù)器端方法的參數(shù),如果參數(shù)多余會(huì)被服務(wù)器端忽略

          和很多對象一樣,NetConnect對象有個(gè)onStatus事件,用于接受返回信息
          下面是比較常見的寫法:
          1 : client_nc.onStatus = function (info){
          2 : //處理狀態(tài)信息的程序代碼
          3 : };
          狀態(tài)信息的類型記錄在信息對象的level屬性中,其可能值為
          status 狀態(tài)
          warning 警告
          error 錯(cuò)誤
          信息的內(nèi)容則記錄在對象的code屬性中。在NetConnect對象中,可以參考下面的范例程序來輸出返回信息:
          01 : client_nc.onStatus = function (info){
          02 : trace ( '信息類型:' + info.level + newline + '信息內(nèi)容:' + info.code );
          03 : switch (info.code){
          04 : case 'NetConnection.Connect.Success':
          05 : trace ( '聯(lián)機(jī)成功!' );
          06 : break;
          07 : case 'NetConnection.Connect.Failed':
          08 : trace ( '聯(lián)機(jī)失敗!' );
          09 : break;
          10 : case 'NetConnection.Connect.Closed':
          11 : trace ( '聯(lián)機(jī)中斷!' );
          12 : break;
          13 : }
          14 : };


          保存日志
          需要的話可以把連接日志記錄下來:
          1 : client_nc.onStatus = function(info)
          2 : {
          3 : _root.log += 'Recording stream status.\n' ;
          4 : _root.log += 'Event: ' + info.code + '\n' ;
          5 : _root.log += 'Type:' + info.level + '\n' ;
          6 : _root.log += 'Message:' + info.description + '\n' ;
          7 : }


          關(guān)閉連接
          要關(guān)閉連接請使用 close()方法,如下面的代碼停止數(shù)據(jù)流對象后關(guān)閉連接
          1 : function disconnect() {
          2 : // Stops publishing the stream.
          3 : srcStream.close();
          4 : // Deletes the source stream connection.
          5 : connection.close();
          6 : }


          NetStream對象--FlashCom Develop閱讀筆記 (十二)

          NetStream對象是在所有聯(lián)機(jī)對象之間傳遞影音串流。如果你僅僅是為了傳遞文字聊天內(nèi)容,使用共享對象就可以解決,不必要使用這個(gè)對象。
          該對象的基本屬性有
          time 到目前為止,串流資料播放的秒數(shù)
          bufferTime 緩沖區(qū)的最大秒數(shù)
          currentFps 當(dāng)前播放影像的速率(每秒幀數(shù))
          bufferLength 當(dāng)前緩沖區(qū)的資料秒數(shù)
          liveDelay 實(shí)時(shí)播放視頻流的間隔
          但是當(dāng)你想知道當(dāng)前播放的影像的總長度的時(shí)候,必須調(diào)用服務(wù)器端的方法才可以,因?yàn)榭蛻舳说腇lashPlayer是無法獲知數(shù)據(jù)流的總長的。你需要在客戶端寫如下方法:
          01 : function getInfo()
          02 : {
          03 : nc.call( 'sendInfo', new MyResultSetName(), myStream);
          04 : }
          05 : function MyResultSetName()
          06 : {
          07 : this.onResult = function ( retVal )
          08 : {
          09 : _root.streamlength = retVal;
          10 : };
          11 : this.onStatus = function(info)
          12 : {
          13 : trace ( 'Level:' + info.level + 'Code:' + info.code);
          14 : // process error object
          15 : };
          16 : }


          然后在服務(wù)器端的main.asc文件中的相關(guān)事件中寫入:
          01 : application.onAppStart = function ()
          02 : {
          03 : trace('::: Application has started :::');
          04 : }
          05 : application.onConnect = function (client)
          06 : {
          07 : application.acceptConnection (client);
          08 : // Add methods
          09 : client.prototype.sendInfo = function (name) {
          10 : var slen = Stream.length (name);
          11 : trace ( 'slen:' + slen);
          12 : return slen;
          13 : };
          14 : }


          相關(guān)方法參考:
          setBufferTime ( 秒數(shù))
          可以設(shè)置緩沖區(qū)的大小以提高低品質(zhì)的網(wǎng)絡(luò)情況
          注意:bufferLength大小總是不大于bufferTime

          attachVideo ( 影像來源,[ 拍攝模式 ] )
          將攝像機(jī)對象的影像追加給串流對象,如果影像來源為null,將停止捕捉影像
          拍攝模式省略表示捕捉連續(xù)的影像;若為0則只拍攝單元格畫面;大于0,將以此數(shù)值為秒數(shù)間隔,連續(xù)拍攝單元格影像。

          attactAudio ( 聲音來源 )
          將麥克風(fēng)的音源設(shè)定給串流對象

          publish ( 串流資料名,[ 播出方式 ])
          如果串流資料名沒有指定則停止播出
          播出方式有l(wèi)ive(默認(rèn)值)實(shí)時(shí)播出但不存儲(chǔ);record 播出同時(shí)以串流資料名.flv文件存儲(chǔ),路徑為應(yīng)用程序路徑下面的streams文件夾;append 播出的同時(shí)追加到指定名稱的flv文件中,如果不存在,則自動(dòng)創(chuàng)建。

          pause()
          暫停、開始播放

          close ()
          停止發(fā)布或播放當(dāng)前所有數(shù)據(jù)流,把 NetStream.time 屬性設(shè)置為 0, 使得其它客戶端可以使用該數(shù)據(jù)流,該方法當(dāng)你使用 NetStream.play() 或NetStream.publish() 的時(shí)候被隱含調(diào)用

          play( 串流名稱,起始時(shí)間,長度,是否清除前一個(gè)串流 )
          起始時(shí)間默認(rèn)值為-2 表示flash會(huì)先嘗試播放實(shí)時(shí)影音,否則就播放指定識(shí)別名稱的文件
          若為-1 將只播放實(shí)時(shí)影音 若為0 將只播放指定名稱的錄像內(nèi)容
          長度參數(shù)指定影音播放的秒數(shù) 默認(rèn)為-1 表示一直播放到結(jié)束 為其它值為播放到指定秒數(shù)的內(nèi)容

          receiveVideo(fps)
          指定播放串流的速率fps設(shè)定為0時(shí),flash將停止播放影像

          seek(秒數(shù))
          快倒倒錄像文件倒指定秒數(shù)的畫面,如果設(shè)為0,則跳轉(zhuǎn)到開頭
          可以使用相對時(shí)間來跳轉(zhuǎn),如
          client_ns.seek(client_ns.time-3)

          如果要在傳輸音頻或視頻流的同時(shí),包含文本數(shù)據(jù)等,也就是說進(jìn)行數(shù)據(jù)交換,則可以使用send方法。
          可以在客戶端包含下面的actionscript:
          1 : var my_nc:NetConnection = new NetConnection();
          2 : my_nc.connect('rtmp://myServer.myDomain.com/appName/appInstance');
          3 : var my_ns:NetStream = new NetStream(my_nc);
          4 : my_ns.publish('slav', 'live');
          5 : my_ns.send('Fun', 'this is a test');

          在接收端可以使用下面代碼:
          1 : var my_nc:NetConnection = new NetConnection();
          2 : my_nc.connect('rtmp://myServer.myDomain.com/appName');
          3 : my_ns = new NetStream(my_nc);
          4 : my_ns.play('slav', -1, -1);
          5 :
          6 : my_ns.Fun = function(str) { //Fun is the handler name
          7 : trace (str);
          8 : }
          關(guān)閉視頻流的幾種方法:
          1 : myStream_ns.publish(false);// 停止整個(gè)串流
          2 : myStream_ns.close();//關(guān)閉串流,當(dāng)然也就停止了串流播放
          3 : mystream_ns.attachVideo(null);//僅僅停止視頻播放,仍然保持音頻播放.

          Video對象FlashCom Develop閱讀筆記 (十三)

          閱讀筆記13 Video對象
          視頻對象用來顯示實(shí)時(shí)的或者錄制的視頻流。視頻對象顯示的可以是通過Camera.get方法捕捉到的實(shí)時(shí)視頻,也可以是通過NetStream.play方法播放的實(shí)時(shí)的或者錄制的視頻文件和MP3音頻文件。
          為了能夠顯示視頻流,首先要放置視頻對象到舞臺(tái),然后使用video.attachVideo方法附加視頻流到視頻對象即可。
          1 : my_cam = Camera.get();
          2 : my_video.attachVideo(myCam); // myVid 是放置到舞臺(tái)的一個(gè)視頻對象

          視頻對象的使用類似于MC,和其它可放置到舞臺(tái)的對象一樣,你可以設(shè)置不同的屬性。視頻對象的常用屬性有:
          width 視頻對象的寬度
          height 視頻對象的高度
          deblocking 是否使用deblocking過濾,默認(rèn)為0自動(dòng)適應(yīng),1為從不使用,2總是使用
          smoothing 是否使用平滑過渡,默認(rèn)為false不使用,true則使用平滑過渡(需要高品質(zhì)播放模式)
          下面的例子說明了如何發(fā)布、錄制和回放視頻
          01 : // 實(shí)時(shí)播放的同時(shí)錄制視頻文件
          02 : //錄制的視頻文件名為 'allAboutMe.flv'
          03 : var my_nc:NetConnection = new NetConnection();
          04 : my_nc.connect('rtmp://localhost/allAboutMe/mySpeech');
          05 : var publish_ns:NetStream = new NetStream(my_nc);
          06 : publish_ns.publish('allAboutMe', 'record');
          07 : publish_ns.attachVideo(Camera.get());
          08 :
          09 : // 播放錄制的視頻文件
          10 : // 注意:播放錄制文件不需要再發(fā)布視頻流
          11 : var my_nc:NetConnection = new NetConnection();
          12 : my_nc.connect('rtmp://localhost/allAboutMe/mySpeech');
          13 : var subscribe_ns:NetStream = new NetStream(my_nc);
          14 : subscribe_ns.play('allAboutMe');
          15 : my_video.attachVideo(subscribe_ns); // my_video是一個(gè)視頻對象實(shí)體
          如果要清除當(dāng)前的視頻對象,可以使用clear方法
          1 : my_video.clear();
          需要注意的是,清除視頻對象并不意味著中斷連接,要中斷數(shù)據(jù)流在視頻對象中的播放,可以這樣處理:
          1 : my_video.attachVideo(null);


          System對象FlashCom Develop閱讀筆記 (十四)

          系統(tǒng)對象是Flash的一個(gè)頂層對象,主要用來設(shè)置系統(tǒng)參數(shù)和安全定義。
          常用屬性有:
          System.useCodepage 是否使用網(wǎng)頁字符格式,默認(rèn)為false 格式是utf-8
          System.exactSettings 訪問本地設(shè)置是否使用超級(jí)域匹配規(guī)則 Flash7新增屬性


          常用的方法有:
          System.showSettings( [panel] ) 顯示系統(tǒng)設(shè)置對話框
          0 隱私設(shè)置
          1 本地存儲(chǔ)設(shè)置
          2 麥克風(fēng)設(shè)置
          3 攝像機(jī)設(shè)置
          為空則顯示用戶最近設(shè)置

          System.setClipboard( string ) 設(shè)置剪貼板文字 Flash7以后支持
          用指定的字符串替換當(dāng)前的剪貼板內(nèi)容


          system對象也具有onStatus事件響應(yīng),我們看下下面的代碼:
          01 : // 定義響應(yīng)方法
          02 : System.onStatus = function( genericError )
          03 : {
          04 : // Your script would do something more meaningful here
          05 : trace('An error has occurred. Please try again.');
          06 : }
          07 :
          08 : // 創(chuàng)建一個(gè) NetStream 對象的方法
          09 : // 如果NetStream 對象返回錯(cuò)誤
          10 : // System.onStatus 將被觸發(fā)
          11 :
          12 : videoStream_ns.onStatus = function(infoObject) {
          13 : if (infoObject.code == 'NetStream.Play.StreamNotFound') {
          14 : trace('Could not find video file.');
          15 : }
          16 : }


          客戶端信息對象FlashCom Develop閱讀筆記 (十五)

          在FlashCom中的Camera, Microphone, LocalConnection, NetConnection,NetStream和SharedObject對象都提供了onStatus事件響應(yīng),onstatus事件的返回信息記錄在信息對象中。為了能夠響應(yīng)這些事件,你必須創(chuàng)建一個(gè)方法來處理信息對象,而最重要的一點(diǎn)是你必須要清楚不同的信息對象返回值和返回類型。
          信息對象具有下面的屬性。
          code 記錄信息的返回內(nèi)容
          level 信息等級(jí)狀態(tài),有status 狀態(tài) warning 警告 error 錯(cuò)誤
          下面對FlashCom中的對象的onstatus返回值作個(gè)總結(jié)。
          Camera信息對象
          Camera.Muted (Status)
          用戶拒絕使用camera
          Camera.Unmuted (Status)
          用戶允許使用camera

          LocalConnection信息對象
          none (status)
          none (error)

          Microphone信息對象
          Microphone.Muted (Status)
          用戶拒絕使用microphone.
          Microphone.Unmuted (Status)
          用戶允許使用microphone.

          NetConnect信息對象
          NetConnection.Call.Failed (Error)
          NetConnection.call方法調(diào)用服務(wù)器端的方法或命令失敗
          NetConnection.Connect.AppShutdown (Error)
          服務(wù)器端應(yīng)用程序已經(jīng)關(guān)閉(由于資源耗用過大等原因)或者服務(wù)器已經(jīng)關(guān)閉.
          NetConnection.Connect.Closed (Status)
          連接中斷
          NetConnection.Connect.Failed (Error)
          連接失敗
          NetConnection.Connect.InvalidApp (Error)
          指定的應(yīng)用程序名稱沒有找到
          NetConnection.Connect.Rejected (Error)
          連接被拒絕
          NetConnection.Connect.Success (Status)
          連接成功

          NetStream 信息對象
          NetStream.Buffer.Empty (Status)
          數(shù)據(jù)緩沖區(qū)為空
          NetStream.Buffer.Full (Status)
          緩沖區(qū)已慢
          NetStream.Failed (Error)
          傳輸中有錯(cuò)誤發(fā)生
          NetStream.Pause.Notify (Status)
          播放暫停
          NetStream.Play.Failed (Error)
          播放出錯(cuò)
          NetStream.Play.PublishNotify (Status)
          發(fā)布開始,信息已經(jīng)發(fā)送到所有訂閱者
          NetStream.Play.Reset (Status)
          播放列表重置
          NetStream.Play.Start (Status)
          播放開始
          NetStream.Play.Stop (Status)
          播放停止
          NetStream.Play.StreamNotFound (Error)
          播放的實(shí)時(shí)流或文件不存在
          NetStream.Play.UnpublishNotify (Status)
          發(fā)布停止,信息已經(jīng)發(fā)送到所有訂閱者
          NetStream.Publish.BadName (Error)
          發(fā)布的數(shù)據(jù)流已經(jīng)被發(fā)布
          NetStream.Publish.Idle (Status)
          發(fā)布者閑置過長
          NetStream.Publish.Start (Status)
          發(fā)布開始
          NetStream.Record.Failed (Error)
          錄制文件出錯(cuò)
          NetStream.Record.NoAccess (Error)
          沒有足夠的文件訪問權(quán)限
          NetStream.Record.Start (Status)
          文件錄制開始
          NetStream.Record.Stop (Status)
          錄制暫停
          NetStream.Seek.Failed (Error)
          數(shù)據(jù)流定位出錯(cuò)
          NetStream.Seek.Notify (Status)
          數(shù)據(jù)搜索定位成功
          NetStream.Unpause.Notify (Status)
          恢復(fù)播放
          NetStream.Unpublish.Success (Status)
          停止發(fā)布

          ShareObject信息對象
          SharedObject.BadPersistence (Error)
          SharedObject.getRemote方法傳遞的參數(shù)不匹配
          SharedObject.Flush.Failed Error
          寫入失敗
          SharedObject.Flush.Success (Status)
          寫入成功
          SharedObject.UriMismatch (Error)
          SharedObject.connect的url參數(shù)和SharedObject.getRemote方法不一致

          注意:對于NetStream、NetConnect和遠(yuǎn)程共享對象而言,在聯(lián)機(jī)情況下onStatus有更多的返回值,這些返回值將會(huì)在服務(wù)器端信息對象中介紹,其它對象無須聯(lián)機(jī)也可以響應(yīng)到返回值。

          針對以上不同的對象可以指定各自的onstatus方法,Macromedia 在Flash中提供了一個(gè)“超級(jí)”函數(shù)叫做System.onStatus ,如果某個(gè)對象的onstatus響應(yīng)的level屬性是error,并且沒有指定響應(yīng)操作的時(shí)候,F(xiàn)lash會(huì)觸發(fā)System.onStatus事件。
          下面的例子演示了如何創(chuàng)建通用的或者特殊的方法來處理信息對象:
          01 : //創(chuàng)建通用方法
          02 : System.onStatus = function (genericError)
          03 : {
          04 : // 在這里寫上詳細(xì)的處理代碼
          05 : trace( 'An error has occurred. Please try again.' );
          06 : };
          07 : // 創(chuàng)建NetConnection對象的onstatus響應(yīng)方法
          08 : // 如果連接返回的值在響應(yīng)事件中沒有定義,并且是error等級(jí)的話
          09 : // System.onStatus 事件會(huì)被響應(yīng)
          10 : nConn.onStatus = function (infoObject)
          11 : {
          12 : if (infoObject.code == 'NetConnection.Connect.Success' )
          13 : {
          14 : trace( 'Successful connection.' );
          15 : }
          16 : if (infoObject.code == 'NetConnection.Connect.Failed' )
          17 : {
          18 : trace( 'Connection failed.' );
          19 : }
          20 : };
          21 : // Attempt to open connection
          22 : nConn = new NetConnection();
          23 : nConn.connect( 'rtmp://myServer.myDomain.com/myRTMPapp' );
          聊天室客戶端限制歷史記錄數(shù)的方法
          有時(shí)候,客戶端歷史記錄不斷的增加,會(huì)導(dǎo)致Flash運(yùn)行和反應(yīng)的遲鈍,可以通過限制歷史記錄數(shù)的方法改善。
          在客戶端的chat組件代碼中找到receiveMessage方法,使用下面的代碼替換
          1 : FCChatClass.prototype.receiveMessage = function( mesg ) {
          2 : //this.history_txt.htmlText += mesg; 這行是原先的實(shí)現(xiàn)代碼
          3 : this.history.push(mesg);
          4 : if (this.history.length>30) this.history.shift();
          5 : this.history_txt.htmlText = this.history.join('');
          6 : this.history_txt.scroll = this.history_txt.maxscroll;
          7 : }
          其中限制記錄數(shù)可以自己調(diào)整,這里設(shè)為30。
          在FCChatClass.prototype.init方法中定義history數(shù)組來保存本地聊天記錄信息
          1 : this.history = new Array();
          還有一個(gè)地方要注意,在清空歷史時(shí)候,也要把本地聊天記錄數(shù)組清空:
          1 : this.history.splice(0);
          表情組件的中文問題已經(jīng)解決
          多謝Luar的指點(diǎn)和分享這些代碼,困擾的中文輸入會(huì)影響表情定位的問題終于解決了。
          在組件代碼中updatePixelPos方法找到
          1 : this.pixel_pos += this.CHAR_WIDTH_MAP[Math.min(1, this.is_bold)][string.charCodeAt(pos)];
          替換成下面這段代碼:
          1 : //*************************************************************
          2 : // Because all English Characters' width is stored in Array
          3 : // If return undefined, it is Chinese character,
          4 : // Hardcode Chinese character width = 13
          5 : //*************************************************************
          6 : var ccWIDTH = this.CHAR_WIDTH_MAP[Math.min(1, this.is_bold)][string.charCodeAt(pos)];
          7 : ccWIDTH = (ccWIDTH == undefined) ? 13 : ccWIDTH;//這行就是解決問題的所在
          8 : this.pixel_pos += ccWIDTH;
          然后在parseHtmlShortcuts方法中找到
          1 : test_pos += this.CHAR_WIDTH_MAP[Math.min(1, this.is_bold)][shortcut_str.charCodeAt(j)];
          替換成下面代碼:
          1 : //*************************************************************
          2 : // Because all English Characters' width is stored in Array
          3 : // If return undefined, it is Chinese character,
          4 : // Hardcode Chinese character width = 13
          5 : //*************************************************************
          6 : var ccWIDTH = this.CHAR_WIDTH_MAP[Math.min(1, this.is_bold)][shortcut_str.charCodeAt(j)];
          7 : ccWIDTH = (ccWIDTH == undefined) ? 13 : ccWIDTH;
          8 : test_pos += ccWIDTH;
          9 : //
          以上均引用luar的修改代碼,非常感謝luar!

          SharedObject對象FlashCom Develop閱讀筆記 (十六)

          我似乎反復(fù)的在講共享對象了,實(shí)在是我覺得共享對象在FlashCom開發(fā)中太重要了,甚至可以說是FCS的靈魂。
          之前的關(guān)于共享對象的文章可以參考我的筆記:
          共享對象概述
          理解共享對象
          還有一篇轉(zhuǎn)載的:共享對象

          shared Object對象相當(dāng)強(qiáng)大,他提供了在多個(gè)客戶端實(shí)時(shí)數(shù)據(jù)共享,并且可以存儲(chǔ)在客戶端或遠(yuǎn)程服務(wù)器。可以把本地共享對象比作cookies,把遠(yuǎn)程共享對象看作實(shí)時(shí)的數(shù)據(jù)傳輸設(shè)備。
          通常共享對象的使用方法如下:
          1. 保持本地永久存儲(chǔ)
          這是最簡單的共享對象應(yīng)用。并且不需要FlashCom Server的支持。例如,你可以使用SharedObject.getLocal方法來創(chuàng)建一個(gè)本地共享對象。因?yàn)楸镜毓蚕韺ο笫怯谰么鎯?chǔ)的,用戶端Flash結(jié)束的時(shí)候會(huì)通過data屬性保存在客戶端本地機(jī)器中。當(dāng)下一次運(yùn)行swf文件的時(shí)候,就可以直接存取到。如果你在影片播放結(jié)束的時(shí)候把共享對象的屬性置空了,下一次就存取不到任何的值了。
          2. 在服務(wù)器端共享和存儲(chǔ)數(shù)據(jù)
          存儲(chǔ)在服務(wù)器端的共享對象數(shù)據(jù)可以被其它聯(lián)機(jī)的客戶端取到。例如,你打開了一個(gè)遠(yuǎn)程共享對象,該共享對象中存儲(chǔ)了一個(gè)電話清單。當(dāng)客戶端對該共享對象數(shù)據(jù)有任何更改的時(shí)候,改變的數(shù)據(jù)對所有聯(lián)機(jī)對象都是自同步的。如果對象暫時(shí)無法連接到服務(wù)器端,那么所作的更改將會(huì)在下一次更新到服務(wù)器端。
          3. 實(shí)時(shí)交流數(shù)據(jù)
          共享對象可以實(shí)時(shí)的在多個(gè)客戶端之間共享數(shù)據(jù)。你可以打開一個(gè)存儲(chǔ)實(shí)時(shí)數(shù)據(jù)的遠(yuǎn)程共享對象,例如,一個(gè)連接到聊天室的用戶列表,當(dāng)有用戶進(jìn)入或離開聊天室的時(shí)候,該共享對象會(huì)實(shí)時(shí)更新,所有連接到該服務(wù)器的客戶端將立刻看到用戶列表的更改。
          下面的例子演示了一個(gè)簡單的共享對象的使用,記住在創(chuàng)建一個(gè)遠(yuǎn)程共享對象之前,必須先使用NetConnect對象聯(lián)機(jī)到服務(wù)器。
          01 : // Create a local shared object
          02 : so = SharedObject.getLocal('foo');
          03 : // Create a remote shared object that is not persistent on the server
          04 : nc = new NetConnection();
          05 : nc.connect('rtmp://server.domain.com/chat/room3';
          06 : so = SharedObject.getRemote('users', nc.uri);
          07 : so.connect(nc);
          08 : // Create a remote shared object that is persistent on the server
          09 : // but not on the client
          10 : nc = new NetConnection();
          11 : nc.connect('rtmp://server.domain.com/chat/room3';
          12 : so = SharedObject.getRemote('users', nc.uri, true);
          13 : so.connect(nc);
          14 : // Create a remote shared object that is persistent on the server
          15 : // and on the client
          16 : nc = new NetConnection();
          17 : nc.connect('rtmp://server.domain.com/chat/room3';
          18 : so = SharedObject.getRemote('users', nc.uri, '/chat');
          19 : so.connect(nc);

          規(guī)劃遠(yuǎn)程共享對象
          要規(guī)劃遠(yuǎn)程共享對象,我們應(yīng)該先設(shè)計(jì)一個(gè)數(shù)據(jù)管理模型。我們需要做的是數(shù)據(jù)字段設(shè)計(jì)和管理、沖突解決、客戶端和服務(wù)器端的存儲(chǔ)分析,我們針對這些方面一一說明。
          如果要使用本地存儲(chǔ)的遠(yuǎn)程共享對象,請確保swf的舞臺(tái)尺寸大于215×138像素,否則將無法正常顯示設(shè)置面板。
          數(shù)據(jù)設(shè)計(jì)和管理
          共享對象關(guān)聯(lián)的數(shù)據(jù)存儲(chǔ)在共享對象的data屬性中,要設(shè)置共享對象的值可以使用下面的方式:
          1 : //建立本地共享對象,沒有則自動(dòng)創(chuàng)建
          2 : var so = SharedObject.getLocal('local_so');
          3 : //為共享對象中的變量賦值
          4 : so.data.userID = 'Liu21st';
          5 : so.data.currentStatus = 'onLine';
          6 : so.data.lastLogon = '2004-06-30';

          如果要?jiǎng)?chuàng)建客戶端的私有存儲(chǔ),可以不通過data屬性,如:
          1 : so.userID = 'Liu21st';
          2 : so.currentStatus = 'onLine';
          3 : so.lastLogon = '2004-06-30';

          對共享對象的data屬性賦NULL或undefined可以初始化字段
          so.data.userID = NULL ;
          但是并沒有刪除該字段,如果要?jiǎng)h除請用:
          delete so.data.userID;
          我們也可以使用類似于
          so.data.year.month.dayOfMonth = someValue;的方式來賦值
          //注意該賦值并非一個(gè)字段 year.month.dayOfMonth
          //而分別是給三個(gè)字段 year,month,dayOfMonth 初始化相同的值

          但是不推薦使用該方式,因?yàn)檫@樣在同步的時(shí)候會(huì)始終占用較多的帶寬
          使用分開賦值的方式可以避免每次同步全部數(shù)據(jù)
          so.data.year = someValue;
          so.data.month = someValue;
          so.data.dayOfMonth = someValue;
          你可以根據(jù)應(yīng)用程序的需求來設(shè)計(jì)共享對象的變量。如果共享對象中的值都需要頻繁更新,盡可能減少共享對象的字段可以提高性能。
          站長經(jīng)常使用的方式是:
          1 : so.data.user = { id:1,sex:b,name:liu21st }
          2 : // 在存取的時(shí)候可以使用
          3 : // so.data.user.name的方式


          沖突解決
          如果多個(gè)客戶端在同時(shí)更新數(shù)據(jù)的話,沖突就產(chǎn)生了。必須制定沖突解決策略,下面是常用的方法。
          1. 盡量使用不同的字段
          最簡單的方法是給每個(gè)客戶端或服務(wù)器端分配不同的字段。例如,為聊天室中的每個(gè)用戶設(shè)定一個(gè)字段,并且每個(gè)用戶只能更改自己的字段。
          2. 分配擁有者
          更高級(jí)的策略是分配一個(gè)客戶端作為共享對象屬性的短期擁有者,你可以鎖定對象的屬性被寫入,在有其它客戶端對該屬性的更新時(shí)候向擁有者發(fā)送請求。如果請求成功,表示只有一個(gè)客戶端更改該共享對象數(shù)據(jù)。
          3. 通知客戶端
          當(dāng)服務(wù)器拒絕客戶端的更改請求的時(shí)候,SharedObject.onSync事件會(huì)通知客戶端該更改暫時(shí)被拒絕,然后,應(yīng)用程序可以提供一個(gè)用戶界面讓用戶再次發(fā)送。這個(gè)策略比較適用于不定期更新的數(shù)據(jù),還有一個(gè)好處是當(dāng)沖突發(fā)生時(shí),客戶端可以選擇接收或拒絕更改。
          4. 選擇性更改
          某些應(yīng)用程序按照“先到先服務(wù)”的原則來定制策略,這種方式適用于用戶可以重新遞交同步請求當(dāng)其他人更新完成之后。
          本地存儲(chǔ)空間的考慮
          你可以選擇讓遠(yuǎn)程共享對象存儲(chǔ)在客戶端、服務(wù)器或者兩者,本地共享對象總是存儲(chǔ)在本地客戶端,直到?jīng)]有可用空間為止。
          默認(rèn)的存儲(chǔ)空間大小是100K,如果企圖存儲(chǔ)更多的數(shù)據(jù),F(xiàn)lash會(huì)彈出一個(gè)本地存儲(chǔ)對話框,讓用戶允許或拒絕本地存儲(chǔ)。
          如果用戶選擇允許,數(shù)據(jù)將被保存,并且SharedObject.onStatus事件觸發(fā),返回的code屬性值為 SharedObject.Flush.Success,如果選擇拒絕,數(shù)據(jù)存儲(chǔ)失敗,code屬性值為SharedObject.Flush.Failed,用戶也可以選擇打開本地存儲(chǔ)面板,進(jìn)行存儲(chǔ)空間大小設(shè)置,并且記住當(dāng)前的選擇。
          在actionscript中無法設(shè)置本地存儲(chǔ)空間的大小,必須通過彈出對話框的形式讓用戶操作,如果需要,請使用:
          System.showSettings(1)

          共享對象的方法總結(jié)
          SharedObject.close
          //關(guān)閉遠(yuǎn)程共享對象和服務(wù)器的連接
          SharedObject.connect
          //連接到服務(wù)器端的一個(gè)遠(yuǎn)程共享對象
          SharedObject.flush
          //立即寫入本地共享對象數(shù)據(jù)
          //如果不使用系統(tǒng)會(huì)在下列情況自動(dòng)完成寫入
          // swf文件關(guān)閉,sharedObject.close調(diào)用,共享對象被回收
          // 如果對遠(yuǎn)程共享對象使用該方法,只會(huì)在客戶端寫入,而不會(huì)在服務(wù)器端寫入,如果要完成服務(wù)器端的寫入請使用下面的代碼:
          01 : // This is a SERVER-SIDE script, not ActionScript
          02 : // Get the shared object when the application is loaded.
          03 : application.onAppStart = function()
          04 : {
          05 : application.mySO = SharedObject.get( 'SharedObjName' , true);
          06 : }
          07 : // When a user disconnects, flush the shared object.
          08 : application.onDisconnect = function(client)
          09 : {
          10 : application.mySO.flush();
          11 : }
          12 : // You can also set a timer to periodically flush the shared object
          13 : // onto the hard disk on the server
          14 : application.onAppStart = function()
          15 : {
          16 : application.mySO = SharedObject.get( 'SharedObjName' , true);
          17 : setInterval(function() { application.mySO.flush(); }, 60000);
          18 : }

          SharedObject.getRemote
          //創(chuàng)建一個(gè)遠(yuǎn)程共享對象
          SharedObject.getSize
          //取得當(dāng)前(本地或遠(yuǎn)程)共享對象的字節(jié)大小
          //var soSize= this.so.getSize();
          SharedObject.send
          //對所有聯(lián)機(jī)用戶廣播消息
          01 : // Create a remote shared object called remoteSO
          02 : // Place an Input Text text box named inputMsgTxt on the Stage
          03 : // Attach this code to a button labeled 'Send Message'
          04 : on (release) {
          05 : _root.remoteSO.send( 'testMsg' ,inputMsgTxt);
          06 : }
          07 : // Attach this code to the frame containing the button
          08 : _root.remoteSO.testMsg = function(recvStr)
          09 : {
          10 : trace(recvStr);
          11 : }
          12 : // Type data in the text box and press the button to see the results

          SharedObject.setFps
          //設(shè)定客戶端更新的速率

          共享對象的創(chuàng)建方法
          SharedObject.getLocal(對象名稱);//不需要服務(wù)器端支持,只用于本地存儲(chǔ)
          01 : // Get the kookie
          02 : so = sharedobject.getlocal( 'kookie' );
          03 : // Get the user of the kookie and go to the frame number saved for this user.
          04 : if (so.data.user != undefined) {
          05 : this.user = so.data.user;
          06 : this.gotoAndStop(so.data.frame);
          07 : }
          08 : The following code block is placed on each movie frame.
          09 : // On each frame, call the rememberme function to save the frame number.
          10 : function rememberme() {
          11 : so.data.frame=this._currentFrame;
          12 : so.data.user= 'John' ;
          13 : }

          SharedObject.getRemote(對象名稱,聯(lián)機(jī)網(wǎng)址);//建立暫存的遠(yuǎn)程共享對象,重啟即失效
          1 : conn = new NetConnection();
          2 : conn.connect( 'rtmp://somedomain.com/applicationName' );
          3 : myObject = SharedObject.getRemote( 'mo' , conn.uri, false);
          4 : myObject.connect(conn);

          SharedObject.getRemote(對象名稱,聯(lián)機(jī)網(wǎng)址,true);//遠(yuǎn)程共享對象數(shù)據(jù)存入服務(wù)器,在服務(wù)器端會(huì)保存'對象名稱.fso'文件

          共享對象的屬性
          data屬性(不再詳述)
          共享對象的方法
          共享對象的事件
          SharedObject.onStatus //共享對象返回錯(cuò)誤、警告或狀態(tài)的事件
          SharedObject.onSync //同步事件

          下面的實(shí)例可以參考:
          01 : function getMaster()
          02 : {
          03 : trace( 'getMaster called' );
          04 : master = SharedObject.getRemote( 'master' , con.uri, true);
          05 : connVal = master.connect(con);
          06 : if (connVal) print ( 'Connection was successful' );
          07 : else print( 'Unable to connect the shared object with the given NetConnection object' );
          08 : master.onSync = function (listVal) {
          09 : getPlayList();
          10 : trace( 'SO: ' + so.data[currentPlaylist]);
          11 : }
          12 : }
          以上所言,主要針對客戶端對象,服務(wù)器端的共享對象使用會(huì)在以后的筆記中再詳細(xì)描述。

          應(yīng)用程序設(shè)計(jì)和開發(fā)--FlashCom Develop閱讀筆記 (十七)

          這篇內(nèi)容主要講述在FCS應(yīng)用程序開發(fā)過程的一些建議和技巧,包含有服務(wù)器兼容性方面的建議、相互依賴關(guān)系、多文件管理、帶寬管理、雙字節(jié)支持、卸載和重載應(yīng)用程序和動(dòng)態(tài)訪問控制等~

          一、服務(wù)器兼容性方面的建議
          使用小寫方式命名你的目錄和文件名
          Macromedia 推薦你使用小寫字母命名FlashCom開發(fā)項(xiàng)目中的目錄和文件,以便更好的工作在不同的服務(wù)器之間。
          使用相對路徑或絕對路徑連接服務(wù)器
          在Fcs開發(fā)中NetConnect.connect命令可以使用絕對和相對路徑來連接指定的應(yīng)用程序,如果你的swf文件和FlashCom服務(wù)器運(yùn)行在同一臺(tái)機(jī)器,你可以使用相對路徑rtmp:/appName/instanceName 來代替
          rtmp://server.domain.com/appName/instanceName
          如果你的開發(fā)你的應(yīng)用程序在一臺(tái)開發(fā)服務(wù)器,并且沒有使用相對路徑在swf文件中,那么移動(dòng)你的swf文件到產(chǎn)品服務(wù)器會(huì)帶來一些額外的工作,因?yàn)槟悴坏貌桓拿恳粋€(gè)NetConnect.connect語句中url參數(shù)。
          如果你的swf文件不會(huì)和flashCom服務(wù)器在同一臺(tái)機(jī)器,那么必須加上絕對路徑,(作者注:當(dāng)然可以通過變量的方法來設(shè)置)

          二、相互依賴關(guān)系
          因?yàn)榭蛻舳撕头?wù)器端的ActionScript腳本代碼都是應(yīng)用程序的一部分,他們必須協(xié)調(diào)工作,并且相互依賴。一個(gè)最典型的例子就是在客戶端和服務(wù)器端之間使用call命令,因?yàn)檎{(diào)用的方法可能是客戶端或者服務(wù)器端自定義的。下面有個(gè)例子可以說明:
          01 : // 客戶端fla文件的 ActionScript 代碼
          02 : my_nc = new NetConnection();
          03 : my_nc.someClientMethod = function()
          04 : {
          05 : //在這里 添加你的處理代碼
          06 : }
          07 : my_nc.connect(“rtmp://hostname:port/appname”);
          08 :
          09 : // 服務(wù)器端的main.asc中的 ActionScript 代碼
          10 : clientObj.call('someClientMethod');

          在服務(wù)器端clientObj.call方法傳遞的參數(shù)必須是在客戶端已經(jīng)定義好的NetConnect對象方法,這是因?yàn)槿魏慰蛻舳说男枰环?wù)器調(diào)用的方法必須通過NetConnect對象連接到服務(wù)器才可以。
          相反,你在客戶端調(diào)用服務(wù)器端的方法
          01 : // 客戶端代碼
          02 : NetConnection.call( 'someServerMethod' );
          03 :
          04 : // 服務(wù)器端代碼
          05 : client.prototype.someServerMethod = function()
          06 : {
          07 : // 這里是處理代碼
          08 : }
          09 : // 或者使用下面的調(diào)用方式也是有效的
          10 : onConnect(newClient)
          11 : {
          12 : newClient.someServerMethod = function()
          13 : {
          14 : // code
          15 : }
          16 : }

          在這種情況下,NetConnect.connect方法的參數(shù)必須是服務(wù)器端(一般是main.asc)已經(jīng)定義好的方法,這是因?yàn)槿魏畏?wù)器端需要被客戶端調(diào)用的方法必須是服務(wù)器端的Client對象的方法。

          三、使用多文件管理
          當(dāng)你的應(yīng)用程序日益復(fù)雜的時(shí)候,不要企圖通過一個(gè)單一的腳本來完成所有的事情。把你的函數(shù)分成不同的文件,每個(gè)提供一定的功能集合。如果你使用多個(gè)文件,還可以使用包含的方式來優(yōu)化性能,使得同一段代碼不需要被執(zhí)行多次。
          客戶端
          例如,在客戶端,如果你想把my_file.as文件能夠被應(yīng)用程序中的其它文件調(diào)用,只需要在my_file.as文件開頭寫上下面的代碼:
          1 : if (_root._my_file_as == null) {
          2 : _root._my_file_as = true;
          3 : // All the code for myfile.as goes here
          4 : }

          然后,在其它文件中,包含下面代碼:
          #include 'my_file.as';
          注意:include指令在編譯時(shí)候被執(zhí)行,而不是運(yùn)行的時(shí)候執(zhí)行。
          服務(wù)器端
          服務(wù)器端的方式有些區(qū)別,因?yàn)樵诜?wù)器端的ActionScript不支持全局對象。例如,你要包含一個(gè)my_flie.asc文件,在該文件開頭依然包含下面這段代碼:
          1 : if (_my_file_asc == null) {
          2 : _my_file_asc = true;
          3 : // All the code for myfile.asc goes here
          4 : }
          區(qū)別就在于其它文件包含該文件的時(shí)候不使用#include指令,而是使用load指令
          load('my_file.asc');

          四、使用唯一的實(shí)體命名
          通常的開發(fā)環(huán)境是多個(gè)用戶同時(shí)連接到同一臺(tái)服務(wù)器,為了避免數(shù)據(jù)流沖突或共享對象被覆蓋,可以在NetConnect.connect命令中使用唯一的實(shí)體名稱。
          如果你想要使用NetConnect 調(diào)試工具,你必須在客戶端代碼的第一行包含NetDebug.as文件,(FlashCom1.5版本并沒有包含NetDebug.as文件,你可以在這里下載)NetDebug.as文件的使用方法不在本文的說明范疇,留待以后再表。

          五、強(qiáng)制顯示Flash設(shè)置面板
          當(dāng)一個(gè)應(yīng)用程序企圖訪問用戶的攝像機(jī)或者麥克風(fēng),以及要在本地存儲(chǔ)數(shù)據(jù)的時(shí)候,flash 會(huì)顯示設(shè)置對話框來得到允許。用戶也可以點(diǎn)擊鼠標(biāo)右鍵來打開設(shè)置面板。如果要強(qiáng)制顯示設(shè)置面板,可以使用下面的代碼:
          // 不帶參數(shù)表示打開用戶上次瀏覽的設(shè)置面板
          1 : System.ShowSettings();
          2 : // 打開保密性設(shè)置面板
          3 : System.ShowSettings(0);
          4 : // 打開本地存儲(chǔ)設(shè)置面板
          5 : System.ShowSettings(1);
          6 : // 打開麥克風(fēng)設(shè)置面板
          7 : System.ShowSettings(2);
          8 : // 打開照相機(jī)設(shè)置面板
          9 : System.ShowSettings(3);

          例如,如果你的應(yīng)用程序需要使用攝像頭,你可能需要提示用戶在彈出的保密性設(shè)置面板中選擇允許。就必須使用
          System.showSettings(0)

          六、帶寬管理
          你可以通過計(jì)算近似的帶寬承受度來控制服務(wù)器發(fā)送到每個(gè)客戶端的數(shù)據(jù)量。有很多種方法可以做到,一種方法是配置FlashCom server的config.xml文件;另一種方法是使用NetStream.receiveVideo 方法來指定傳輸速率;第三種方法是通過設(shè)置客戶端Camera.Quality屬性和服務(wù)器端的Client.setBandwidthLimit方法。下面會(huì)詳細(xì)講述第三種方法。
          Fcs自帶的doc_bandwidth示例程序演示如何讓用戶選擇不同的帶寬設(shè)置。選擇不同的帶寬設(shè)置后,客戶端的麥克風(fēng)和攝像頭設(shè)置也會(huì)根據(jù)用戶的選擇更新,服務(wù)器端的帶寬限制也會(huì)更新。
          客戶端的ActionScript提供了一個(gè)用戶界面讓用戶選擇三種不同的帶寬設(shè)置:Modem、DSL和LAN。當(dāng)用戶改變了帶寬限制后,攝像頭和麥克風(fēng)設(shè)置也會(huì)更新,還有一個(gè)不引人注意的地方,就是updateBandwidth方法也會(huì)根據(jù)設(shè)置的選擇改變屏幕的尺寸。
          01 : _root.Modem_btn.onPress = function() {
          02 : // Call updateBandwidth to change
          03 : // camera and mic settings and inform
          04 : // the server
          05 : _root.updateBandwidth(1);
          06 : }
          07 : _root.DSL_btn.onPress = function() {
          08 : _root.updateBandwidth(2);
          09 : }
          10 : _root.LAN_btn.onPress = function() {
          11 : _root.updateBandwidth(3);
          12 : }

          在fla文件的第一幀,你可以找到下面一段代碼,用來初始化攝像頭和麥克風(fēng),以及從服務(wù)器播放串流和根據(jù)用戶的選擇更新攝像頭、麥克風(fēng)的設(shè)置。
          01 : #include 'NetDebug.as'
          02 : stop();
          03 : // Initialize movie by getting a camera and microphone, and
          04 : // Configure the initial camera and microphone settings
          05 : client_cam = Camera.get();
          06 : client_cam.setMode(150,120,5);
          07 : client_cam.setQuality(0, 90);
          08 : client_mic = Microphone.get();
          09 : client_mic.setRate(22);
          10 : // Get the stream to publish and play
          11 : function getPlayStream() {
          12 : // Get new net connection
          13 : client_nc = new NetConnection();
          14 : // Handle status message
          15 : client_nc.onStatus = function(info) {
          16 : trace( 'Level: ' + info.level + newline + 'Code: ' + info.code);
          17 : }
          18 : client_nc.connect('rtmp:/doc_bandwidth/room_01');
          19 : // Create a stream to which to publish
          20 : out_ns = new NetStream(client_nc);
          21 : out_ns.attachVideo(client_cam);
          22 : out_ns.attachAudio(client_mic);
          23 : out_ns.publish('myAV');
          24 : Chapter 5 70
          25 : // Create a stream to receive the published data
          26 : in_ns = new NetStream(client_nc);
          27 : Output_mc.fromSrvr.attachVideo(in_ns);
          28 : Output_mc.fromSrvr.attachAudio(in_ns);
          29 : in_ns.play('myAV');
          30 : }
          31 : // Called from the bandwidth buttons
          32 : function updateBandwidth(b) {
          33 : // Respond to a change in the bandwidth
          34 : // If 'Modem' was selected
          35 : if ( b == 1 ) {
          36 : client_cam.setMode(160,120,2);
          37 : client_cam.setQuality(0, 75);
          38 : client_cam.setKeyFrameInterval(3);
          39 : client_mic.setRate(5);
          40 : // For demonstration purposes, change size of screen
          41 : Output_mc._height = 100;
          42 : Output_mc._width = 150;
          43 : // If 'DSL' was selected
          44 : } else if ( b == 2 ) {
          45 : client_cam.setMode(160,120,5);
          46 : client_cam.setQuality(0, 85);
          47 : cam.setKeyFrameInterval(5);
          48 : client_mic.setRate(11);
          49 : // For demonstration purposes, change size of screen
          50 : Output_mc._height = 130;
          51 : Output_mc._width = 175;
          52 : // If 'LAN' was selected
          53 : } else {
          54 : client_cam = Camera.get();
          55 : client_cam.setMode(160,120,15);
          56 : client_cam.setQuality(0, 90);
          57 : client_cam.setKeyFrameInterval(10);
          58 : client_mic.setRate(22);
          59 : // For demonstration purposes, change size of screen
          60 : Output_mc._height = 150;
          61 : Output_mc._width = 200;
          62 : }
          63 : // Call the server function setBandwidth and pass the user’s
          64 : // selection, b.
          65 : client_nc.call('setBandwidth', 0, b);
          66 : }
          67 : // Get the stream to play
          68 : getPlayStream();

          在服務(wù)端的main.asc文件中,包含了setBandwidth方法,被客戶端調(diào)用。
          01 : // If server-side code is part of the application,
          02 : // it must define an onConnect function that accepts
          03 : // the client connection.
          04 : application.onConnect = function(client) {
          05 : // Establish the connection
          06 : application.acceptConnection(client);
          07 : }
          08 : // Called when user presses a bandwidth choice (Modem=1, DSL=2, LAN=3)
          09 : Client.prototype.setBandwidth = function(bw) {
          10 : // set the bandwidth for the client
          11 : if ( bw == 1 ) {
          12 : // modem settings
          13 : this.setBandwidthLimit( 35000/8, 22000/8 );
          14 : } else if ( bw == 2 ) {
          15 : // DSL settings
          16 : this.setBandwidthLimit( 800000/8, 100000/8 );
          17 : } else {
          18 : // LAN settings
          19 : this.setBandwidthLimit( 400000, 400000 );
          20 : }
          21 : }


          七、開發(fā)雙字節(jié)應(yīng)用程序
          如果需要在服務(wù)器端的開發(fā)環(huán)境使用雙字節(jié)文字,你的服務(wù)器端ActionScript代碼必須使用utf-8編碼。這意味著你必須采用支持UTF-8的編輯器書寫代碼,然后可以用內(nèi)建的JavaScript方法,例如Date.toLocalString 來轉(zhuǎn)換成本地編碼。
          如果使用雙字節(jié)字符作為方法名稱,必須使用對象數(shù)組操作方式而不能用點(diǎn)操作方式。
          1 : // 使用雙字節(jié)命名的方法格式
          2 : obj['方法名稱'] = function(){ }
          3 : // 使用單字節(jié)命名的方法格式
          4 : obj.MethodName = function() { }


          八、卸載和重載應(yīng)用程序
          應(yīng)用程序?qū)嶓w會(huì)自動(dòng)卸載通過垃圾回收機(jī)制。當(dāng)所有的用戶斷開應(yīng)用程序的連接的時(shí)候,垃圾回收會(huì)首先運(yùn)行,然后應(yīng)用程序會(huì)自動(dòng)卸載。換句話說,并不是所有用戶斷開連接的時(shí)候應(yīng)用程序就馬上卸載。因?yàn)閼?yīng)用程序的啟動(dòng)通常需要一段時(shí)間,所以下一個(gè)客戶端的連接并不會(huì)占用啟動(dòng)的開銷。
          默認(rèn),垃圾回收每20分鐘發(fā)生一次,你可以修改這個(gè)值(必須大于0)。
          當(dāng)你對main.asc文件有任何修改的時(shí)候,你必須重載應(yīng)用程序才可以生效。而這樣就會(huì)斷開當(dāng)前所有用戶的連接。重載應(yīng)用程序的方法可以通過管理控制臺(tái)和應(yīng)用程序監(jiān)視器來完成。

          九、執(zhí)行動(dòng)態(tài)訪問控制
          服務(wù)器端的ActionScript給共享對象和串流對象提供了執(zhí)行動(dòng)態(tài)訪問控制列表(ACL)的功能機(jī)制。默認(rèn)所有的連接對串流和共享對象有完全訪問權(quán)限。你可以控制某個(gè)用戶具有創(chuàng)建、讀寫共享對象和串流的權(quán)限,每個(gè)連接到服務(wù)器端的應(yīng)用程序?qū)嶓w都會(huì)有一個(gè)服務(wù)器端的Client對象參考,并且每一個(gè)Client對象都有兩個(gè)屬性:readAccess和writeAccess。使用這兩個(gè)屬性,就可以設(shè)置每個(gè)連接的權(quán)限。
          下面有個(gè)示例:
          client.readAccess = 'appSO/'
          client.writeAccess = 'appStreams/public/;appSO/public/'
          該例子說明了對一個(gè)Client對象實(shí)體client作了權(quán)限控制
          如果要對全部Client對象設(shè)置權(quán)限,可以使用
          client.readAccess = 'appSO/' ; //所有客戶端都可以訪問appSO目錄
          client.writeAccess= 'appSO/public/'; //所有連接的客戶端都可以該目錄下創(chuàng)建共享對象或數(shù)據(jù)流
          但是卻無法寫入 appSO/private/ 目錄。
          表情組件中的歷史記錄限制
          使用表情組件以后,以前的歷史記錄限制的方法就不行了,需要修改表情組件來實(shí)現(xiàn)。
          在parseString方法中找到:
          1 : this.msgHistory_array.push({ _str:str, _beginIndex:beginIndex, _endIndex:endIndex });
          在下面增加代碼:
          1 : if (this.msgHistory_array.length>30) {
          2 : this.msgHistory_array.shift();
          3 : this.smiley_mc_array.shift();
          4 : }
          這樣把歷史記錄數(shù)組限制到了一定數(shù)目,但是文本框內(nèi)的顯示仍然沒有限制,因?yàn)槲谋究虻娘@示是通過
          1 : this.smiley_txt.htmlText += ' + this.smiley_fmt.font + '\' size=\'' + this.smiley_fmt.size + '\'>' + this.str.rightTrim() + ' ';
          輸出的.
          我嘗試修改輸出方式如下:
          在開始保存字串信息到數(shù)組
          1 : tempstr='';
          2 : for (i=0;i < this.msgHistory_array.length;i++){
          3 : tempstr += this.msgHistory_array[ i ]['_str'];
          4 : }
          在輸出的時(shí)候使用this.smiley_txt.htmlText = tempstr;


          良好的編程習(xí)慣--FlashCom Develop閱讀筆記 (十八)

          本節(jié)內(nèi)容概述了在使用actionscript編程和創(chuàng)建應(yīng)用程序的時(shí)候需要遵循的一些規(guī)則,以及如何使我們的程序代碼更有效和具有更好的可讀性,更方便調(diào)試應(yīng)用程序。
          把這節(jié)寫在前面,也是為了讓開始接觸ActionScript編程的開發(fā)人員從一開始就養(yǎng)成好的編程和開發(fā)習(xí)慣。
          1. 遵循命名規(guī)則
          一個(gè)應(yīng)用程序的命名規(guī)劃必須保持一致性和可讀性。任何一個(gè)實(shí)體的主要功能或用途必須能夠根據(jù)命名明顯的看出來。因?yàn)锳ctionScript是一個(gè)動(dòng)態(tài)類型的語言,命名最好是包含有代表對象類型的后綴。一般而言,名詞_動(dòng)詞和形容詞_名詞之類的語法是最常用的命名方式,如:
          影片名字:my_movie.swf
          URL實(shí)體:course_list_output
          組件或?qū)ο竺Q:chat_mc
          變量或?qū)傩裕簎serName
          方法和變量的名稱應(yīng)該以小寫字母開頭,對象和對象的構(gòu)造方法應(yīng)該大寫。命名變量的時(shí)候使用大小寫混和的方式,并且使用字母打頭,還可以包含數(shù)字和下劃線。
          下面的一些命名是非法的:
          _count =5 ;//首字符不能使用下劃線
          5count = 0;//首字符不能使用數(shù)字
          foo/bar = true;//包含非法字符
          另外,ActionScript使用的保留字不能用來命名變量。
          ActionScript是基于ECMAScript,所以我們可以根據(jù)ECMAScript的規(guī)范來命名。如,
          course_list_output = 'foo'; //全部小寫,使用下劃線分割字串
          courseListOutput = 'foo'; // 大小寫混和的方式
          BASEURL = http://www.foo.com; // 常量使用全部大寫
          MAXCOUNTLIMIT = 10;
          MyObject = function(){ }; // 構(gòu)造函數(shù)
          f = new MyObject(); // 對象
          注意;良好的命名規(guī)范還可以使用Flash的代碼提示功能。

          2. 給你的代碼添加注釋
          使用代碼注釋能夠使得程序更清晰,也便于我們閱讀。Flash支持的代碼注釋方法有兩種:
          單行注釋,通常用于變量的說明
          var clicks = 0; // variable for number of button clicks
          多行注釋,通常用于功能說明和大段文字的注釋:
          /*
          Initialize the clicks variable that keeps track of the number of times
          the button has been clicked.
          */
          一些具有特定意思的注釋方法:
          // :TODO: topic
          表明一個(gè)主題的開始
          // :BUG: [bugid] topic
          顯示了一個(gè)BUG所在
          // :KLUDGE:
          表明下面的代碼并不完善,可能存在問題
          // :TRICKY:
          告訴開發(fā)人員下面的代碼具有相互作用,修改之前請謹(jǐn)慎

          3. 保持代碼的整體性
          無論什么情況,應(yīng)該盡可能保證所有代碼在同一個(gè)位置,這樣使得代碼更容易搜索和調(diào)試。我們在調(diào)試程序的時(shí)候很大的困難就是定位代碼,如果大部分代碼都集中在同一幀,問題就比較好解決了。通常,我們把代碼都放在第一幀中,并且單獨(dú)放在最頂層。如果在第一幀中集中了大量的代碼,記得用注釋標(biāo)記區(qū)分,并在開頭加上代碼說明。
          1 : //===========================================
          2 : // 視頻語音聊天系統(tǒng)
          3 : // FCAVPresence組件
          4 : // Copyright ◎2002 Macromedia, Inc. All rights reserved.
          5 : // 完 善: Liu21st, Liu21st@126.com
          6 : //---------------------------------------------------------


          在獨(dú)立的功能模塊前面加上類似的標(biāo)注:
          1 : //===========================================
          2 : // 參數(shù)初始化
          3 : //---------------------------------------------------------


          4. 初始化應(yīng)用程序
          記得一定要初始化你的應(yīng)用程序,init函數(shù)應(yīng)該是你的應(yīng)用程序類的第一個(gè)函數(shù),如果使用面向?qū)ο蟮木幊谭绞絼t應(yīng)該在構(gòu)造函數(shù)中進(jìn)線初始化工作。該函數(shù)只是對應(yīng)用程序中的變量和對象初始化,其它的調(diào)用可以通過事件驅(qū)動(dòng)。
          下面的例子可以說明如何進(jìn)線初始化
          1 : function FCAVPresenceClass() {
          2 : this.init();
          3 : }
          4 : FCAVPresenceClass.prototype.init = function() {
          5 : this.name = (this._name == null ? '_DEFAULT_' : this._name);
          6 : this.prefix = 'FCAVPresence.' + this.name + '.';
          7 : };


          5.使用局部變量
          所有的局部變量使用關(guān)鍵字var來申明,這樣可以避免被全局變量訪問,更重要的是,可以保證變量不被覆蓋和混淆程序邏輯。例如,下面的代碼沒有使用var來申明,覆蓋了其它變量。
          01 : counter = 7;
          02 : function loopTest()
          03 : {
          04 : trace(counter);
          05 : for(counter = 0; counter < 5; counter++)
          06 : {
          07 : trace(counter);
          08 : }
          09 : }
          10 : trace(counter);
          11 : loopTest();
          12 : trace(counter);
          輸出結(jié)果為:
          7
          7
          0
          1
          2
          3
          4
          5

          6. 創(chuàng)建對象時(shí)使用原型添加方法和屬性
          當(dāng)我們創(chuàng)建一個(gè)對象的時(shí)候,應(yīng)當(dāng)使用原型方式來添加對象的方法或?qū)傩裕沟迷摲椒ɑ驅(qū)傩阅軌虮凰性搶ο蠡蜃訉ο蟮膶?shí)體所訪問。這種能夠確保內(nèi)存中每個(gè)函數(shù)只有一份拷貝。作為一般的規(guī)則,不要在構(gòu)造函數(shù)中定義方法。下面是一個(gè)正確的例子:
          01 : // Best practice for creating an object
          02 : MyObject = function()
          03 : { }
          04 : MyObject.prototype.name = '';
          05 : MyObject.prototype.setName = function(name)
          06 : {
          07 : this.name = name;
          08 : }
          09 : MyObject.prototype.getName = function()
          10 : {
          11 : return this.name;
          12 : }


          下面這段代碼是不可取的:
          01 : // Less desirable practice for creating an object
          02 : MyObject = function()
          03 : {
          04 : this.name = '';
          05 : this.setName = function(name)
          06 : {
          07 : this.name = name;
          08 : }
          09 : this.getName = function()
          10 : {
          11 : return this.name;
          12 : }
          13 : }
          使用上面的方式在每個(gè)對象的實(shí)體被創(chuàng)建的時(shí)候都會(huì)實(shí)體重新復(fù)制每一個(gè)屬性和方法,會(huì)加重系統(tǒng)的內(nèi)存開銷。

          7. 規(guī)范命名方式獲取代碼提示功能
          這方面我已經(jīng)有過詳細(xì)的敘述,請看:
          [ actionscript代碼提示功能 ]和 [ 面向?qū)ο蠓绞降拇a提示功能 ]
          服務(wù)器端ActionScript的命名和搜索路徑
          當(dāng)FlashCom Server端應(yīng)用程序加載的時(shí)候,服務(wù)器會(huì)檢查服務(wù)器端的ActionScript文件。
          該文件可以位于application目錄下或者其scripts子目錄下,并且可以有多種命名方式。
          通常,都放在application目錄的應(yīng)用程序目錄下面,名稱為main.asc。這是FlashCom Server默認(rèn)的方式,但是,為了安全和管理起見,我們應(yīng)該另外命名以更好的區(qū)分不同的應(yīng)用程序。因此,使用<application_name>.asc的命名是一個(gè)良好的習(xí)慣,我們甚至可以使用js作為文件擴(kuò)展名。
          下面是服務(wù)器端Actionscript文件的搜索順序:
          1 : 位于/scripts目錄下面的main.asc文件
          2 : 位于目錄下面的main.asc文件
          3 : 位于/scripts目錄下面的main.js文件
          4 : 位于目錄下面的main.js文件
          5 : 位于/scripts目錄下面的.asc文件
          6 : 位于目錄下面的.asc文件
          7 : 位于/scripts目錄下面的.js文件
          8 : 位于目錄下面的.js文件

          在上面的搜索路徑中,<appName>是指應(yīng)用程序的目錄名稱
          一般地,對于開發(fā)模式,該目錄位置在C:\inetpub\wwwroot\flashcom\applications\<appName>
          對于產(chǎn)品模式 默認(rèn)位置為 C:\Program Files\Macromedia\Flash Communication Server\flashcom\applications\<appName>.
          如果是Linux環(huán)境,應(yīng)該是/opt/macromedia/fcs/application/<appName>
          加載另外的Actionscript文件
          如果要在服務(wù)器端ActionScript文件中加載另外的文件,需要使用Load命令
          如load( 'logic.asc' );
          FlashCom server 首先會(huì)在當(dāng)前目錄搜索logic.asc文件,然后再搜索 Application.xml (位于C:\Program Files\Macromedia\Flash Communication Server MX\conf\_defaultRoot_\_defaultVHost_\Application.xml或/opt/macromedia/fcs/conf/Application.xml)中<ScriptLibPath>標(biāo)記指定的目錄。
          對于開發(fā)模式,該標(biāo)記默認(rèn)為
          1 : C:\inetpub\wwwroot\flashcom\scriptlib
          對于產(chǎn)品模式,默認(rèn)為:
          1: <ScriptLibPath>C:Program FilesMacromediaFlash Communication Server MXflashcomscriptlib</ScriptLibPath>
          在Linux環(huán)境下,為
          1 : /opt/macromedia/fcs/scriptlib

          如果要指定多個(gè)搜索路徑,可以用分號(hào)隔開


          服務(wù)器管理ActionScript API--FCS閱讀筆記(十九)

          FlashCom Server MX 1.5 包含了服務(wù)器管理的ActionScript API,提供了一些高級(jí)的方法集用來擴(kuò)展管理控制臺(tái),讓我們可以自己開發(fā)Flash應(yīng)用程序的管理和監(jiān)視工具。

          使用服務(wù)器管理ActionScript API
          為了使用服務(wù)器管理ActionScript API,你必須安裝有FlashMX和FlashCom server,并且具有FlashCom Server的管理權(quán)限。當(dāng)然,你還能很熟練的用ActionScript來編寫Flash應(yīng)用程序。
          掌握服務(wù)器管理ActionScript API最好的方法是查看管理控制臺(tái)的源代碼。注冊用戶可以在Macromedia的下載中心下載到admin.fla文件。

          建立服務(wù)器連接
          FlashCom Server的默認(rèn)端口是1935,但是,為了使用服務(wù)器管理Actionscript API,你必須連接到管理端口,默認(rèn)1111。連接服務(wù)器的方式和Flashcom應(yīng)用程序一樣使用
          NetConnect.connect方法,不同的是需要傳遞三個(gè)參數(shù):服務(wù)器管理目錄的url,管理員用戶名,管理員密碼。有效的管理員名稱和密碼是在配置文件Server.xml中定義的。下面是連接示例:
          1 : nc = new NetConnection();
          2 : nc.connect('rtmp://localhost:1111/admin', 'admin', '1234');為了使用更安全的用戶認(rèn)證機(jī)制,建議使用防火墻控制對1111端口。[筆者注:更多的關(guān)于安全方面的內(nèi)容以后會(huì)專門敘述]

          語法示例
          要使用服務(wù)器端ActionScript API 的方法,你必須使用call指令并使用相應(yīng)的參數(shù)。
          下面的示例中,getAppStats方法被調(diào)用,并由new receiveAppStats事件處理反饋信息,ChatApp是該方法需要傳遞的應(yīng)用程序名參數(shù)。
          1 : nc = new NetConnection();
          2 : nc.connect('rtmp://localhost:1111/admin', 'MHill', '635xjh27');
          3 : // Call getAppStats
          4 : nc.call('getAppStats', new receiveAppStats(), 'ChatApp');

          一個(gè)簡單的應(yīng)用程序例子
          下面的例子調(diào)用了getAppStats方法來查看服務(wù)器的應(yīng)用程序chatApp的狀態(tài)
          appName 是一個(gè)文本輸入框的實(shí)例名
          outputBox 是返回結(jié)果的文本框?qū)嵗?br />01 : /** Establishes the connection to Flash Communication Server **/
          02 : nc = new NetConnection();
          03 : nc.connect('rtmp://localhost:1111/admin','admin_name','admin_pass');
          04 : /** Makes the API call, for example, 'GetAppStats' **/
          05 : function doGetAppStats() {
          06 : function onGetAppStats()
          07 : {
          08 : this.onResult = function(info)
          09 : {
          10 : if (info.code != 'NetConnection.Call.Success')
          11 : outputBox.text = 'Call failed: ' + info.description;
          12 : else {
          13 : outputBox.text = 'Info for '+appName.text+ ' returned:' + newline;
          14 : printObj(info, outputBox);
          15 : }
          16 : }
          17 : }
          18 : nc.call('getAppStats', new onGetAppStats(), appName.text);
          19 : }
          20 : // This function proceeds through an object, printing all values to the
          21 : // destination, including recursively printing objects within objects.
          22 : // The tabLevel parameter is used for cosmetic purposes.
          23 : function printObj(obj, destination, tabLevel)
          24 : {
          25 : if (arguments.length < 2) {
          26 : trace('ERROR! you need to supply a text object to output to');
          27 : return;
          28 : }
          29 : if (arguments.length < 3)
          30 : tabLevel = 0;
          31 : for (var prop in obj) {
          32 : for (var i = 0; i < tabLevel; i++) // insert requested # of tab characters
          33 : destination.text += '\t';
          34 : destination.text += prop + ' = ' + obj[prop] + newline;
          35 : if (typeof (obj[prop]) == 'object') { // recursively call printObj
          36 : printObj(obj[prop], destination, tabLevel+1 );
          37 : }
          38 : }
          39 : }
          40 : // Alerts you if there are errors connecting to the server.nc.onStatus =
          41 : function(info) {
          42 : if (info.code == 'NetConnection.Connect.Success') {
          43 : trace('Connected! The call should work')
          44 : } else {
          45 : // use nc.isConnected to test condition of server
          46 : if (! nc.isConnected)
          47 : trace('NO netConnection to server. Call will not work');
          48 : }
          49 : }

          服務(wù)器端信息對象
          所有服務(wù)器端ActionScript API 方法返回值都都保存在信息對象的相關(guān)屬性中,這些屬性和客戶端的信息對象屬性有所區(qū)別,分別是:level, code, timestamp, data, description和 details。其中l(wèi)evel, code和 timestamp 屬性是全部都具備的,其它屬性是某些方法才具有的。data屬性通常用來返回對象或數(shù)組數(shù)據(jù),description和details屬性通常提供一些錯(cuò)誤信息。

          方法總結(jié)
          服務(wù)器管理ActionScript API包含了三種類型的方法:
          查詢方法:查看你的FlashCom服務(wù)器、應(yīng)用程序和指定的應(yīng)用程序?qū)嵗臓顟B(tài)信息;
          管理方法:對Flashcom服務(wù)器的用戶管理、服務(wù)器管理和應(yīng)用程序管理等
          配置方法:查看和設(shè)置服務(wù)器的配置文件
          有些方法只有管理員才有權(quán)限操作(用*號(hào)注明),虛擬主機(jī)的管理員不能夠使用這些方法。

          查詢方法概要
          01 : getActiveInstances 返回包含所有正在運(yùn)行中的應(yīng)用程序?qū)嵗臄?shù)組
          02 : getAdaptors Returns an array of adaptor names.
          03 : getAdminContext Returns the administrative context for the administrator (administrator type, name of
          04 : adaptor, and name of the virtual host).
          05 : getApps 返回所有應(yīng)用程序的名稱數(shù)組
          06 : getAppStats 返回指定應(yīng)用程序的所有實(shí)例的集合信息
          07 : getInstanceStats 返回當(dāng)前運(yùn)行的應(yīng)用程序?qū)嵗脑敿?xì)信息
          08 : getIOStats 返回 I/O 信息 *
          09 : getLicenseInfo 返回license 信息
          10 : getLiveStreams 返回指定應(yīng)用程序當(dāng)前發(fā)布的所有實(shí)時(shí)串流信息
          11 : getLiveStreamStats 返回串流的詳細(xì)信息
          12 : getMsgCacheStats 返回服務(wù)器TCMessage緩存狀態(tài)信息.
          13 : getNetStreams 返回當(dāng)前連接到應(yīng)用程序的所有的NetStream列表
          14 : getNetStreamStats 返回指定NetStream的詳細(xì)信息.
          15 : getScriptStats 得到指定應(yīng)用程序?qū)嵗哪_本運(yùn)行信息
          16 : getServerStats 取得服務(wù)器狀態(tài)和統(tǒng)計(jì)信息*
          17 : getSharedObjects 返回當(dāng)前應(yīng)用程序?qū)嵗乃泄蚕韺ο髷?shù)組
          18 : getSharedObjectStats 返回共享對象的詳細(xì)信息
          19 : getUsers 返回連接當(dāng)前到應(yīng)用程序?qū)嵗乃杏脩魯?shù)組
          20 : getUserStats 返回指定用戶的詳細(xì)信息
          21 : getVHosts 返回虛擬主機(jī)的數(shù)組
          22 : getVHostStats 返回虛擬主機(jī)的統(tǒng)計(jì)信息
          23 : ping 返回服務(wù)器狀態(tài)標(biāo)記的信息
          管理方法概要
          01 : addAdmin 添加一個(gè)系統(tǒng)管理員*
          02 : addApp 添加一個(gè)新的應(yīng)用程序(會(huì)自動(dòng)創(chuàng)建目錄)
          03 : changePswd 更改管理員密碼
          04 : gc 強(qiáng)制服務(wù)器端的資源垃圾回收*
          05 : reloadApp 重啟應(yīng)用程序,會(huì)先卸載該應(yīng)用程序的實(shí)例
          06 : removeAdmin 刪除管理員*
          07 : removeApp 刪除應(yīng)用程序或應(yīng)用程序?qū)嵗?br />08 : restartVHost 重啟虛擬主機(jī)
          09 : startServer 啟動(dòng)FlashCom Server*
          10 : startVHost 啟動(dòng)指定的虛擬主機(jī)*
          11 : stopServer 停止FlashCom Server*
          12 : stopVHost 停止虛擬主機(jī)
          13 : unloadApp 卸載應(yīng)用程序以及所有實(shí)例,端口用戶連接
          配置方法概要
          1 : getConfig 返回指定配置鍵的配置信息
          2 : setConfig 設(shè)置指定的配置鍵
          關(guān)于每個(gè)方法的詳細(xì)資料請參考手冊中的說明。
          posted on 2006-06-04 20:17 blog搬家了--[www.ialway.com/blog] 閱讀(2531) 評論(0)  編輯  收藏 所屬分類: FMS
          主站蜘蛛池模板: 积石山| 邹城市| 元氏县| 盖州市| 灵台县| 响水县| 陕西省| 霞浦县| 中江县| 广东省| 和平县| 临海市| 安溪县| 临漳县| 海林市| 务川| 黑水县| 襄樊市| 中阳县| 甘德县| 三穗县| 凤台县| 南华县| 建湖县| 驻马店市| 闽侯县| 紫云| 铁力市| 隆回县| 楚雄市| 玉山县| 呈贡县| 屏山县| 炎陵县| 宣汉县| 常宁市| 宝应县| 南阳市| 洪泽县| 龙胜| 洱源县|