连接到FMS服务器(Flash/Flex两种实现)

转自 http://www.51as.com/fms/fms3jiaochen.html 

 

连接到FMS服务器(Flash/Flex两种实现) - 第1篇:Connection

一 、FMS应该做些什么 

     本文中所使用到的FMS是非常简单的,主要就就是建立一个FMS应用,方法很简单。找到你安装FMS的目录你会发现里面有一个appliations的目录。对的,它就是管理FMS应用的目录,进入该目录在里面建立一个文件夹就OK,我建立的文件夹为"firstFMS"。

 

二、Flash连接到FMS服务器

     首先建立一个Flash文件(ActionScript 3.0)并将其保存在某个目录(自己决定吧)中。然后打开组件面板(可以按Ctrl+F7)从组件面板中拖拽一个button组件到刚建立好的Flash的舞台(也就是Flash显示东西的那一块地方),然后通过属性面板(可以按Ctrl+F3)将刚拖拽出的button取个名字(Flash中叫他为实例名,舞台中的每一个组件就是一相对应的对象的实例),我取的是btnConnFMS

     完成上面两步后回到舞台,鼠标在舞台中空白位置点击一下,然后同样打开属性面板,你会发现现在的属性面板和先前的有些不一样,在发布选项下找到“类”,这里我填写的为“ConnFMS”,表示我将要通过ConnFMS.as这个类文件来对当前的这个Flash进行编码。

     上面承诺了由ConnFMS.as来负责Flash的编码工作,那该怎么做呢?建立一个ActionScript类文件,保存在之前保存Flash文件的同一目录就OK,记住这个类文件一定是“ConnFMS.as”。下面是ConnFMS.as的完整代码:

 package 
 
{
 
     
import flash.net.NetConnection;
 
     
import flash.net.NetStream;
 
     
import flash.display.MovieClip;
 
     
import flash.net.Responder;
 
     
import flash.events.MouseEvent;
 
     
import flash.events.NetStatusEvent;
 
     
import flash.events.AsyncErrorEvent;
 
      
     
public class ConnFMS extends MovieClip
 
     
{
 
         
private var nc:NetConnection;
 
          
         
public function ConnFMS()
 
         
{
 
             btnConnFMS
.label="连接到FMS";
 
         
}
 
          
         
private function onClickHandler(evt:MouseEvent):void
 
         
{
 
             trace
("正在连接FMS服务器");
 
             nc
= new NetConnection();
 
             nc
.connect("rtmp://localhost/firstFMS");
 
             nc
.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
 
         
}
 
          
         
private function onNetStatusHandler(evt:NetStatusEvent):void
 
         
{
 
             
switch (evt.info.code)
 
             
{
 
                 
case "NetConnection.Connect.Success":
 
                     trace
("成功连接FMS服务器!");
 
                     
break;
 
                 
case "NetConnection.Connect.Rejected":
 
                     trace
("访问FMS服务器权限不足,连接被拒绝!");
 
                     
break;
 
                 
case "NetConnection.Connect.InvalidApp":
 
                     trace
("指定的应用程序名称没有找到");
 
                     
break;
 
                 
case "NetConnection.Connect.Failed":
 
                     trace
("连接失败!");
 
                     
break;
 
                 
case "NetConnection.Connect.AppShutDown":
 
                     trace
("服务器端应用程序已经关闭(由于资源耗用过大等原因)或者服务器已经关闭!");
 
                     
break;
 
                 
case "NetConnection.Connect.Closed":
 
                     trace
("与FMS的连接中断!");
 
                     
break;
 
             
}
 
         
}
 
     
}
 
 
}

 三、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的完整代码:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="
http://www.adobe.com/2006/mxml" layout="absolute"> 
   
<mx:Script>
 
        <![CDATA[ 
            import mx.controls.Alert; 
            //Flex与FMS建立连接的对象 
            private var nc:NetConnection; 
            //FMS服务器的地址,使用rtmp协议 
            private var rtmpUrl:String="rtmp://localhost/firstFMS"; 
             
            //当Flex应用程序启动的时候就建立与FMS服务器的连接 
            internal function onClick():void 
            { 
                nc = new NetConnection(); 
                nc.connect(rtmpUrl); 
                nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler); 
                nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncErrorHandler); 
            } 
             
            private function onClickHandler(evt:MouseEvent):void 
            { 
                trace("正在连接FMS服务器"); 
                nc = new NetConnection(); 
                nc.connect("rtmp://localhost/firstFMS"); 
                nc.client=this; 
                nc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler); 
                nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncErrorHandler); 
            } 
         
            private function onNetStatusHandler(evt:NetStatusEvent):void 
            { 
                switch (evt.info.code) 
                { 
                    case "NetConnection.Connect.Success": 
                        trace("成功连接FMS服务器!"); 
                        break; 
                    case "NetConnection.Connect.Rejected": 
                        trace ("访问FMS服务器权限不足,连接被拒绝!"); 
                        break; 
                    case "NetConnection.Connect.InvalidApp": 
                        trace("指定的应用程序名称没有找到"); 
                        break; 
                    case "NetConnection.Connect.Failed": 
                        trace("连接失败!"); 
                        break; 
                    case "NetConnection.Connect.AppShutDown": 
                        trace("服务器端应用程序已经关闭(由于资源耗用过大等原因)或者服务器已经关闭!"); 
                        break; 
                    case "NetConnection.Connect.Closed": 
                        trace("与FMS的连接中断!"); 
                        break; 
                } 
            } 
             
            private function onAsyncErrorHandler(evt:AsyncErrorEvent):void 
            {} 
    ]]> 
   
</mx:Script>
 
   
<mx:Button x="135" y="89" label="Button" click="onClick()" fontSize="12" fontWeight="normal"/>
 
</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的管理控制台查看到详细的连接信息。

  我通常是使用的FMS安装目录下的fms_adminConsole.swf 来查看连接信息,也可以使用FMSfms_adminConsole.htm查看。

 

 

 

连接到FMS服务器(Flash/Flex两种实现) - 第2篇:Hello World

在做FMS开发中,flash客户端与FMS服务器通信交互数据等是常见的,比如flash客户端需要一播放一个视频,需要获得FMS发向flash端的一条消息等。那么我们要怎么才能实现flash客户端与FMS服务器建立可交互的连接、通信呢?

     本文将以flash客户端于FMS服务器通信为核心,以经典的"Hello World"示例详细介绍flash客户端于FMS服务器通信的实现。要实现两端通信,在客户端和服务器端都需要编码,一边发起通信请求和接收通信响应信息(flash客户端),一端则提供接收请求进行业务处理等(FMS服务器端)。

     首先从flash客户端入手,本文的实例非常简单,要实现的功能就是flash客户端向FMS服务器端发起请求,调用FMS服务器上的一个方法,然后将FMS服务器上的方法返回值输出到控制台。


     flash端的开发可以有两种方式实现:Flash和Flex。本文会将这两种方式的实现都给出实例。首先看看Flash里的实现。
     启动Flash CS开发环境,新建立ActionScript 3.0的Flash文件,如下图:
              


     然后在上面新建立的ActionScript 3.0的Flash文件上,按F9进入动作面板(输入程序代码的地方,当然也可以将代码封装到单独的类文件里),如下图:             


 

      上图中已经将通过Flash开发连接到FMS服务器的代码全部贴出,代码很简单。NetConnection这个类在 Flash Player 和 Flash Media Server 应用程序之间或者 Flash Player 和运行 Flash Remoting 的应用程序服务器之间创建双向连接。

  通过NetConnection建立于FMS服务器的连接,然后使用NetConnection类的公共方法connect()通过RTMP协议连接到指定的FMS服务器上指定的应用,如上图示为连接的FMS服务器上名为的“HelloWorld”的这个应用。如果对NetConnection还不熟悉的朋友请先阅读下我的这系列文章的第一篇:《连接到FMS服务器(Flash/Flex两种实现)-FMS3系列教程1》,随后通过调用call()方法调用FMS服务器上的方法,这里通过调用服务器上提供的sayHelloWorld()方法。

     Responder 类提供了一个对象,该对象在 NetConnection.call() 中使用以处理来自与特定操作成功或失败相关的服务器的返回值。详细见构造Responder对象的时候构造方法的参数,一个方法处理操作成功的逻辑,一个方法处理操作失败的逻辑。

     OK,完成了上面的flash客户端的开发现在就只差FMS服务器端的开发了,FMS服务器理需要有一个通信文件来负责于flash客户端的连接交互,通常情况下就是建立一个main.asc的通信文件。本文中的通信文件的程序代码非常简单,就是接受客户端的连接,然后提供一个客户端调用的方法。完整代码入下:

 application.onConnect = function(client) 
 
{ 
     client
.sayHelloWorld=function(str) 
     
{ 
         
return "I can say:Hello "+ str; 
     
} 
       
this.acceptConnection(client); 
 
}

 

 通过上面的客户端和FMS服务器的开发,现在这样可以按Ctrl+Enter测试了,看看我们的flash小程序是否能够成功的连接到FMS服务器上指定的HelloWorld,并成功调用服务器端指定的方法呢?打开FMS管理控制台可以看到如下截图效果。OK,我们的小程序已经成功的连接到了FMS服务器上指定的应用(HelloWorld):

          

     下面是测试输出结果截图:
          

  上面的实现是直接将代码写在Flash中,我们也可以将代码提取出来形成ActionScript文件(类),只要该类文件继承于显示对象,通过Flash CS3的新特性设置舞台文档类就可以调用了,下面是提取为ActionScript类的编程实现:

 package 
 
{ 
     
import flash.net.*; 
     
import flash.events.*; 
     
import flash.display.*; 
      
     
public class ClientCallServer extends Sprite 
     
{ 
         
private var nc:NetConnection; 
         
private var rs:Responder; 
         
public function ClientCallServer():void 
         
{ 
             nc
=new NetConnection(); 
             rs
=new Responder(onSuccess,onFailed); 
             nc
.connect("rtmp://localhost/HelloWorld"); 
             nc
.client=this; 
             nc
.call("sayHelloWorld",rs,"World"); 
         
} 
          
         
private function onSuccess(rs:Object):void 
         
{ 
             trace
(rs.toString()); 
         
} 
          
         
private function onFailed(rs:Object):void 
         
{ 
             trace
(rs.description()); 
         
} 
     
} 
 
}

或许有的朋友已经习惯了使用Flex开发,喜欢用拖拽控件的方式来完成一些常用的功能,其实在Flex下开发和Flash差别不是很大,其实在编码层次上是没什么区别的,不同的只是界面的呈现方式不一样。

 private var nc:NetConnection; 
 
private var fmsServer:String="rtmp://localhost/HelloWorld"; 
 
private var rs:Responder; 
  
 
private function initApp():void 
 
{ 
     nc
= new NetConnection(); 
     nc
.connect(fmsServer); 
     nc
.client=this; 
 
}

Flex下开发,建立好mxml后可以直接在其内部的<mx:Script>组件里编写ActionScript代码,如上定义了连接FMS服务器的NetConnection类的实例等。还定义了一个在Flex应用初始化的使用调用的方法initApp(),用来 完成flash客户端与FMS服务器的连接。

 private function onClick():void
 {
     rs = new Responder(onSuccess,onFailed);
     nc.call("sayHelloWorld",rs,"World");
     nc.addEventListener(NetStatusEvent.NET_STATUS,onStatus);
     nc.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncHandler);
 }

同Flash中开发一样,给Responder指定了成功和失败后的处理函数,详细如下:

/** 
 * 通信成功并返回结果时被调度 
 */
 
private function onSuccess(result:Object):void 
{

    Alert.show(result.toString(),"调用结果");

}

 
/** 
 * 通信失败并返回结果时被调度 
 */
 
private function onFailed(result:Object):void 
{ 
   
Alert.show(result.description); 
   
Alert.show(result.code); 
}

 如上就完成了Flex中调用FMS服务器并调用FMS上所提供的方法,服务器端的程序和前面 Flash中的一样。到此我们只需要调用onClick()方法就可以测试了,通过一个按钮组件来调用,如下:

< mx:Button x = " 91 "  y = " 219 "  label = " Call "  click = " onClick() " />
完整Flex代码:
 
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" fontSize="12"
    creationComplete="initApp()">
    <mx:Script>
        <![CDATA[
            import mx.controls.Alert; 
           
private var nc:NetConnection; 
           
private var fmsServer:String="rtmp://localhost/HelloWorld"; 
           
private var rs:Responder; 
             
           
private function initApp():void 
           
{ 
                nc
= new NetConnection(); 
                nc
.connect(fmsServer); 
                nc
.client=this; 
           
} 
             
           
private function onClick():void 
           
{ 
                rs
= new Responder(onSuccess,onFailed); 
                nc
.call("sayHelloWorld",rs,"World"); 
                nc
.addEventListener(NetStatusEvent.NET_STATUS,onStatus); 
                nc
.addEventListener(AsyncErrorEvent.ASYNC_ERROR,onAsyncHandler); 
           
} 
             
           
private function onStatus(evt:NetStatusEvent):void 
           
{ 
               
Alert.show(evt.info.code); 
           
} 
             
           
public function onAsyncHandler(evt:AsyncErrorEvent):void 
           
{ 
                 
           
} 
             
           
/**//** 
             * 通信成功并返回结果时被调度 
             */
 
           
private function onSuccess(result:Object):void 
           
{ 
               
Alert.show(result.toString(),"调用结果"); 
           
} 
             
           
/**//** 
             * 通信失败并返回结果时被调度 
             */
 
           
private function onFailed(result:Object):void 
           
{ 
               
Alert.show(result.description); 
               
Alert.show(result.code); 
           
} 
             
           
private function onBWDone(rs:Object):void 
           
{}

        ]]>
       
    </mx:Script>
    <mx:Button x="91" y="219" label="Call" click="onClick()"/>
</mx:Application>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值