天天看點

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

版權聲明:原創作品,允許轉載,轉載時請務必以超連結形式标明文章 原始出處 、作者資訊和本聲明。否則将追究法律責任。http://beniao.blog.51cto.com/389148/137935

FMS是個很牛X的東西,到底有多牛X我不想在這裡多說,有興趣的朋友可以baidu一把了解一下,如果實在是不想動手,那你就點下面的連接配接吧,我搜尋了點資料簡單的總結了一下。

    你可以點選這裡了解一些關于FMS的基本知識: 了解一些FMS的基本概念

     通常做FMS都是和Flash或是Flex結合開發的,特别是在視訊流這方面相當的突出,成功案例也不少,比如http://www.tudou.com,  www.ku6.com , http://www.15dv.com 等視訊網站都與FMS挂鈎。本人也是因為工作需要,趁工作之餘來學習這門技術,想通過寫部落格的方式來鞏固和分享學習,更希望愛好或是在從事這方面開發工作的朋友多多指正,交流。OK,本文就以連接配接FMS伺服器作為寫作話題,來看看我們學習FMS應該從什麼地方出發,逐漸的走上更高的台階。

     Adobe公司的産品Flash和Flex都可以結合FMS進行程式設計,本文示例比較簡單,為了多湊幾個字我打算通過Flash和Flex兩種實作來介紹怎麼來實作我們的第一個FMS程式“連接配接到FMS伺服器”。

     上山砍柴不忘磨柴刀,那麼我們做技術開發肯定也離不開對開發環境,開發工具,開發語言的選擇和準備。本文中我們的工具就是Flash CS 4,Flex Builder 3和FMS 3.0,所使用的開發語言是Action. 3.0,這裡我不想浪費時間去介紹軟體的安裝,相信看這篇文章的你對于安裝軟體不會存在有什麼難度,OK,下面看看怎麼編碼實作。

一 、FMS應該做些什麼 

     本文中所使用到的FMS是非常簡單的,主要就就是建立一個FMS應用,方法很簡單。找到你安裝FMS的目錄你會發現裡面有一個appliations的目錄。對的,它就是管理FMS應用的目錄,進入該目錄在裡面建立一個檔案夾就OK,我建立的檔案夾為"firstFMS"。

二、Flash連接配接到FMS伺服器

     首先建立一個Flash檔案(Action. 3.0)并将其儲存在某個目錄(自己決定吧)中。然後打開元件面闆(可以按Ctrl+F7)從元件面闆中拖拽一個button元件到剛建立好的Flash的舞台(也就是Flash顯示東西的那一塊地方),然後通過屬性面闆(可以按Ctrl+F3)将剛拖拽出的button取個名字(Flash中叫他為執行個體名,舞台中的每一個元件就是一相對應的對象的執行個體),我取的是btnConnFMS。

     完成上面兩步後回到舞台,滑鼠在舞台中空白位置點選一下,然後同樣打開屬性面闆,你會發現現在的屬性面闆和先前的有些不一樣,在釋出選項下找到“類”,這裡我填寫的為“ConnFMS”,表示我将要通過ConnFMS.as這個類檔案來對目前的這個Flash進行編碼。

     上面承諾了由ConnFMS.as來負責Flash的編碼工作,那該怎麼做呢?建立一個Action.類檔案,儲存在之前儲存Flash檔案的同一目錄就OK,記住這個類檔案一定是“ConnFMS.as”。下面是ConnFMS.as的完整代碼:

 1 package

 2 {

 3     import flash.net.NetConnection;

 4     import flash.net.NetStream;

 5     import flash.display.MovieClip;

 6     import flash.net.Responder;

 7     import flash.events.MouseEvent;

 8     import flash.events.NetStatusEvent;

 9     import flash.events.AsyncErrorEvent;

10     

11     public class ConnFMS extends MovieClip

12     {

13         private var nc:NetConnection;

14         

15         public function ConnFMS()

16         {

17             btnConnFMS.label="連接配接到FMS";

18         }

19         

20         private function onClickHandler(evt:MouseEvent):void

21         {

22             trace("正在連接配接FMS伺服器

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

");

23             nc = new NetConnection();

24             nc.connect("rtmp://localhost/firstFMS");

25             nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);

26         }

27         

28         private function onNetStatusHandler(evt:NetStatusEvent):void

29         {

30             switch (evt.info.code)

31             {

32                 case "NetConnection.Connect.Success":

33                     trace("成功連接配接FMS伺服器!");

34                     break;

35                 case "NetConnection.Connect.Rejected":

36                     trace ("通路FMS伺服器權限不足,連接配接被拒絕!");

37                     break;

38                 case "NetConnection.Connect.InvalidApp":

39                     trace("指定的應用程式名稱沒有找到");

40                     break;

41                 case "NetConnection.Connect.Failed":

42                     trace("連接配接失敗!");

43                     break;

44                 case "NetConnection.Connect.AppShutDown":

45                     trace("伺服器端應用程式已經關閉(由于資源耗用過大等原因)或者伺服器已經關閉!");

46                     break;

47                 case "NetConnection.Connect.Closed":

48                     trace("與FMS的連接配接中斷!");

49                     break;

50             }

51         }

52     }

53 }

 三、Flex連接配接到FMS伺服器

     首先建立好Flex項目,預設會建立一個MXML檔案,簡單化實作這裡就直接在這個MXML檔案裡來實作連接配接FMS。代碼上和Flash連接配接到FMS幾乎沒有什麼差别,主要就是學習NetConnection類來完成,如下代碼定義:

1 //Flex與FMS建立連接配接的對象

2 private var netConn:NetConnection;

3 //FMS伺服器的位址,使用rtmp協定

4 private var rtmpUrl:String="rtmp://localhost/firstFMS"; 

   NetConnection訓示 Flash Player 是通過持久性的 RTMP 連接配接連接配接到伺服器,實作這一步操作是通過NetConnection類的connect()方法來完成的。如下:

1 //當Flex應用程式啟動的時候就建立與FMS伺服器的連接配接,

2 internal function onInit():void

3 {

4     netConn = new NetConnection();

5     netConn.connect(rtmpUrl);

6     netConn.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);

7     netConn.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncErrorHandler);

8 }   

  connect()方法打開指定rtmp協定位址的FMS伺服器的連接配接。一旦調用該方法NetConnection的對象就會捕捉到FMS傳回的一個網絡連接配接狀态,通過NetStatusEvent事件監聽可以得到傳回狀态的值(詳細見本文前Flash部分),AsyncErrorEvent事件為異步引發異常(既本機異步代碼)時排程。關于NetConnection的各種狀态的詳細請檢視本文之前的Flash執行個體有詳細的介紹。

   由于執行個體比較簡單,這裡我就不在多說廢話,下面是通過Flex實作連接配接到FMS的完整代碼:

 1

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

<?xml version="1.0" encoding="utf-8"?>

 2

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

 3

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

    <mx:.>

 4

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

        <![CDATA[

 5

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            import mx.controls.Alert;

 6

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            //Flex與FMS建立連接配接的對象

 7

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            private var nc:NetConnection;

 8

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            //FMS伺服器的位址,使用rtmp協定

 9

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            private var rtmpUrl:String="rtmp://localhost/firstFMS";

10

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
11
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            //當Flex應用程式啟動的時候就建立與FMS伺服器的連接配接

12

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            internal function onClick():void

13

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

{

14

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                nc = new NetConnection();

15

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                nc.connect(rtmpUrl);

16

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);

17

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncErrorHandler);

18

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            }

19

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
20
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            private function onClickHandler(evt:MouseEvent):void

21

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

{

22

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
                trace("正在連接配接FMS伺服器
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

");

23

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                nc = new NetConnection();

24

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                nc.connect("rtmp://localhost/firstFMS");

25

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                nc.client=this;

26

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);

27

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncErrorHandler);

28

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            }

29

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
30
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            private function onNetStatusHandler(evt:NetStatusEvent):void

31

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

{

32

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                switch (evt.info.code)

33

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

{

34

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                    case "NetConnection.Connect.Success":

35

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        trace("成功連接配接FMS伺服器!");

36

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        break;

37

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                    case "NetConnection.Connect.Rejected":

38

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        trace ("通路FMS伺服器權限不足,連接配接被拒絕!");

39

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        break;

40

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                    case "NetConnection.Connect.InvalidApp":

41

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        trace("指定的應用程式名稱沒有找到");

42

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        break;

43

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                    case "NetConnection.Connect.Failed":

44

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        trace("連接配接失敗!");

45

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        break;

46

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                    case "NetConnection.Connect.AppShutDown":

47

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        trace("伺服器端應用程式已經關閉(由于資源耗用過大等原因)或者伺服器已經關閉!");

48

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        break;

49

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                    case "NetConnection.Connect.Closed":

50

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        trace("與FMS的連接配接中斷!");

51

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                        break;

52

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

                }

53

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            }

54

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
55
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

            private function onAsyncErrorHandler(evt:AsyncErrorEvent):void

56

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)
第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

{}

57

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

    ]]>

58

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

    </mx:.>

59

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

    <mx:Button x="135" y="89" label="Button" click="onClick()" fontSize="12" fontWeight="normal"/>

60

第一個FMS程式,連接配接到FMS伺服器(Flash/Flex兩種實作)

</mx:Application>

四、注意事項

  通常新手在學習FMS的時候都會遇到一個問題,那就是通過NetConnection連接配接FMS伺服器的時候,連接配接狀态總是傳回“NetConnection.Connect.Rejected”這樣的狀态結果,然後接着還有會有一個“NetConnection.Connect.Failed”狀态,是什麼原因造成這樣的錯誤的呢?

  第一個錯誤從本文執行個體中你可以得到,是通路FMS伺服器的權限問題,如果FMS沒有開設足夠的通路權限,通常在通路FMS的用戶端都會接受到這樣一個異常狀态。第二個錯誤又是怎麼産生的呢?這還是又通路權限引起,當用戶端沒有主夠的權限通路FMS伺服器,就将傳回“NetConnection.Connect.Rejected”狀态并自動斷開與FMS伺服器的連接配接,“NetConnection.Connect.Failed”狀态本身是由于連接配接伺服器失敗産生,而這裡是因為權限問題而引發的。

  前幾天很多朋友就在問我這個問題,怎麼來解決這個問題呢?如果你是一個技術專研者,如果又你趕興趣的技術在你面前,你首先會做什麼?檢視官方提供的文檔?執行個體代碼?還是什麼? OK,其實要解決這個問題很簡單,在FMS伺服器安裝好後的目錄下有一個"applications"目錄,裡面有兩個FMS預設安裝的FMS伺服器(live和vod),随便打開一個預設安裝然後打開裡面的"readme.txt"檔案會看到下面的字樣:

================================================================

Deploying an unsigned vod service

================================================================

1. Create a new folder in the {FMS-Install-Dir}/applications folder.

2. If you are replacing the default Adobe signed live service, back up

   the following files:

   * main.far

   * Application.xml

   * allowedHTMLDomains.txt

   * allowedSWFDomains.txt

3. Copy files from {FMS-Install-Dir}/samples/applications/vod to the directory you created in step 1.

  現在你知道怎麼解決上面出現的問題了嗎??将這main.far、Application.xml、allowedHTMLDomains.txt和allowedSWFDomains.txt這四個檔案複制到你建立的FMS伺服器目錄下就解決了,出現上面的這種情況主要原因是由于FMS版本安裝選擇錯誤引起,如果安裝的是Flash media streaming server就會出現類似上面的問題,建議安裝Flash media interactive server版本。

        運作上面的執行個體程式,然後可以通過FMS的管理控制台檢視到詳細的連接配接資訊。我通常是使用的FMS安裝目錄下的fms_adminConsole.swf 來檢視連接配接資訊,也可以使用FMSfms_adminConsole.htm檢視。

本文出自 “beniao” 部落格,請務必保留此出處http://beniao.blog.51cto.com/389148/137935本文出自 51CTO.COM技術部落格

繼續閱讀