天天看点

第一个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技术博客

继续阅读