文档章节

利用FluorineFx实现RTMP协议应用开发

vimfung
 vimfung
发布于 2016/06/26 21:55
字数 1269
阅读 158
收藏 0

今天研究了一下FluorineFx下如何实现rtmp协议的应用开发,从网上找了一些文章和资料,照着做发现是碰到了不少问题。不过到最后还是被我解决了,因此写下这篇文章一来怕自己以后给忘了,二来让其他遇到同样问题的朋友们提供一个参考。

其实要实现rtmp协议很简单,先来说说服务器端的操作步骤,首先使用Visual Studio创建一个新项目FluorineFxASP.NET网站(本人使用的是VS2010,顺便说一下FluorineFx在VS2010下没有项目模板,不过网上有人自己制作了一个项目模板,前提是你要先安装FluorineFx然后再安装他的模板即可制作FluorineFx相关应用了。需要的朋友可以到这里下载:http://www.dotblogs.com.tw/ouch1978/archive/2010/11/11/fluorinefxtemplate.aspx?fid=22774)。然后再添加一个FluorineFxServiceLibrary项目。如下图所示:

    然后再FlashRemotingServiceLibrary中添加一个作为实现rtmp协议的应用类MyRtmpApp.cs。如同:

    这里要注意的是,MyRtmpApp类需要继承FluorineFx.Messaging.Adapter.ApplicationAdapter否则无法正常运行。然后为MyRtmpApp类写上客户端连接事件处理,代码如下:

publicoverridebool AppConnect(FluorineFx.Messaging.Api.IConnection connection, object[]parameters)

{

    return true;

}

    这里只是作为演示,因此不需要作任何验证用户身份的处理,直接返回true则表示接受客户端连接。完成这一步后,接下来就是更改服务器端配置的工作了,打开网站中的WEB-INF/flex/services-config.xml配置文件。在channels节点下添加多一个channel-definition节点用于开启rtmp协议处理功能(事实上配置文件中已存在此配置只是将其注释掉了,只要把注释符去掉即可)。配置完成后的配置文件内容如下图:

       记住上面配置的rtmp端口2037,因为在客户端连接时需要指定到该端口才能访问到应用(如果你的2037端口被其他应用占用可以设置到其他端口上)。接下来在网站下添加文件夹apps,在apps中再添加文件夹MyRtmpApp(此文件夹的名称最好和你定义的应用类名称相同),最后在MyRtmpApp文件夹中添加配置文件app.config,文件内容如下图所示:

    这里要注意的是app.config配置文件中的application-handler节点中的type属性一定准确地填上刚才创建的应用类的全限定名称(包含名称空间)。否则可能导致无法正常运行。

    服务端的工作就暂且告一段落了,先来写一个客户端的程序来访问一下看能够正常连接。客户端的代码如下所示(我使用的是FlexBuilder4.5作为开发环境):

var request:URLRequest = new URLRequest("http://localhost/Gateway.aspx");

var loader:URLLoader = new URLLoader(request);

loader.addEventListener(Event.COMPLETE, loaderCompleteHandler);

 

private function loaderCompleteHandler(event:Event):void{

  var connect:NetConnection()=new NetConnection();

  connect.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);

  connect.connect("rtmp://localhost:2037/MyRtmpApp","");

  connect.client=this;

}

private function netStatusHandler(event:NetStatusEvent):void{

  trace(event.info);

}

    整段代码中最值得注意的是我是先调用了站点的Gateway.aspx页面等待成功后再进行MyRtmpApp的应用连接的。为什么这样做呢?网上的资料都没有说到这个问题,之前由于我没有调用这个页面导致我一直连接失败,在偶然的一次调试中发现连接成功,后来在IIS上经过多次的验证发现如果站点处未激活状态下(也就是说w3wp这个进程没有启动的时候)直接进行应用的连接请求是会导致连接失败的。这也说明了.net环境下的rtmp需要依靠IIS中的进程服务来维持(不像FMS那样专门有一个服务来处理)。连接成功后会在event的info属性中返回。Info的属性列表如下图:


    既然连接成功,接下来就可以与服务器端进行通讯了,为了让大家可以了解更加透彻,我会从客户端连接成功后调用服务器端的一个名叫Say的方法,然后服务器端在这个方法里面调用客户端的一个receiveContent的方法来让客户端收到自己发送的消息。把上面的客户端代码改了一下,如下所示:

varrequest:URLRequest=newURLRequest("http://localhost/Gateway.aspx");

varloader:URLLoader=newURLLoader(request);

loader.addEventListener(Event.COMPLETE,loaderCompleteHandler);

 

private function loaderCompleteHandler(event:Event):void{

   var connect:NetConnection = new NetConnection();

   connect.addEventListener(NetStatusEvent.NET_STATUS, netStatusHandler);

   connect.connect("rtmp://localhost:2037/MyRtmpApp","");

   connect.client=this;

}

 

private function netStatusHandler(event:NetStatusEvent):void{

    var connect:NetConnection = event.target as NetConnection;

   trace(event.info);

   if(event.info.code == "NetConnection.Connect.Success"){

       //调用服务端方法

       connect.call("Say",connect as flash.net.Responder,"Hello world!");

   }

}

 

public function receiveContent(content:String):void{

    trace("receive :"+content);

}

服务器端代码如下:

publicvoid Say(string content)

{

  IServiceCapableConnection connection = FluorineContext.Current.Connection as IServiceCapableConnection;

  if(connection != null)

  {

     connection.Invoke("receiveContent", newobject[]{content}, this);

  }

}

 

public void ResultReceived(IPendingServiceCall call)

{

}

    服务器端的MyRtmpApp需要实现IpendingServiceCallback接口,此接口用于监听客户端方法返回委托ResultReceived。

    在FB中测试,可以看到控制台中输出receive :Hello world!字符串。那就证明测试成功了。

© 著作权归作者所有

共有 人打赏支持
vimfung

vimfung

粉丝 59
博文 59
码字总数 85338
作品 4
广州
技术主管
iOS 直播类APP开发流程解析

1 . 音视频处理的一般流程: 数据采集→数据编码→数据传输(流媒体服务器) →解码数据→播放显示 1、数据采集: 摄像机及拾音器收集视频及音频数据,此时得到的为原始数据 涉及技术或协议: ...

HeroHY
2017/02/10
0
0
如何实现微信小程序与Native App多人连麦直播?

微信在去年年底开放了小程序直播接口。小程序从仅适用于阅读、生活服务、工具等应用的流量入口,成为了许多音视频应用的又一个新平台。新功能的开放让更多应用可以利用微信的熟人社交链为应用...

Agora
04/18
0
0
【腾讯Bugly干货分享】H5 视频直播那些事

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57a42ee6503dfcb22007ede8 Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员...

腾讯Bugly
2016/08/12
158
0
【腾讯bugly干货分享】HTML 5 视频直播一站式扫盲

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://bugly.qq.com/bbs/forum.php?mod=viewthread&tid=1277 视频直播这么火,再不学就 out 了。 为了紧跟潮流,本文将...

腾讯Bugly
2016/07/04
791
4
[总结]RTMP流媒体技术零基础学习方法

本文主要总结一些我在学习RTMP流媒体技术过程中积累的经验。也为后来学习RTMP流媒体技术的人们一个参考。本文力图从简到难,循序渐进的介绍RTMP流媒体技术的方方面面,先从应用说起,逐步深化...

leixiaohua1020
2013/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

解析高可用分布式键值存储 etcd 的原理

这篇文章将会介绍 etcd 的实现原理,其中包括 Raft 协议、存储两大模块,在最后我们也会简单介绍 etcd 一些具体应用场景。 etcd 的官方将它定位成一个可信赖的分布式键值存储服务,它能够为整...

小刀爱编程
24分钟前
2
0
在ubuntun虚拟机里安装goLang语言编程环境

Go语言是谷歌2009发布的第二款开源编程语言。 Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。 北京时间201...

JerryWang_SAP
25分钟前
6
0
c++builder导出函数export function DLL

__stdcall __export 即可,如: ulong __stdcall __export od_disasm(char *src,ulong srcsize,ulong srcip, t_disasm *disasm,int disasmmode){ return Disasm(src,srcsiz......

simpower
26分钟前
2
0
KDC服务安装及配置

阿伦哥-
29分钟前
2
0
mybatis-plus公共字段操作以及springboot2整合mybatis-plus

1、公共实体 对于User类中有而user表中没有的属性需要加第二个注解@TableField(exist = false),表示排除User类中的属性 所有新增公共字段加注解 并指定 @TableField(value = "corp_code",fi...

glen_xu
34分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部