- 简介
Red5的主要功能和Macromedia公司的FMS类似,提供基于Flash的流媒体服务的一款基于Java的开源流媒体服务器。它由Java语言编写,使用RTMP作为流媒体传输协议,这与FMS完全兼容。它具有流化FLV、MP3文件,实时录制客户端流为FLV文件,共享对象,实时视频播放、Remoting等功能。用Red5替换FMS后,客户端不用更改可正常运行。
提供red5相关的链接:
下载地址:http://www.red5.org/downloads/
相关实例:http://trac.red5.org/wiki/Examples
相关文档:http://trac.red5.org/wiki/Documentation
- 运行部署实例
- ApplicationAdapter类
- //Red5应用程序启动时自动执行此方法
- public boolean appStart(IScope arg0)
- public void appStop(IScope arg0)
//flex客户端连接项目时自动运行的方法
- public boolean appConnect(IConnection arg0, Object[] arg1)
//flex客户端与服务器断开连接时触发的方法
- public void appDisconnect(IConnection arg0)
//flex客户端与服务器连接时运行,与appConnect比较类似
- public boolean appJoin(IClient arg0, IScope arg1)
//flex客户端与服务器断开时运行,与appDisconnect类似
- public void appLeave(IClient arg0, IScope arg1)
- Red5关键API
Red5提供了很多接口供开发人员进行二次开发:
IConnection:连接对象。每个连接都有一个关联的客户端和域。连接可能是持续型、轮询型、或短暂型。建立此接口的目的,是为了给不同的子类,如 RTMPConnection,RemotingConnection,AJAXConnection, HttpConnection 等,提供基础通用的方法。它提供getClient()方法来获取客服端对象。
IScope :每个Red5应用程序至少有一个域,用来搭建处理器、环景、服务器之间的连接。域可以构成树形结构,所有客户端都可以作为其节点共享域内的对象(比如流和数据)。所有的客服端(client)通过连接(connection)连接到域中。对于单一域,每个连接对应一个客服端,每个客服端对应一个id,简单的应用,操作就针对一个id和一个连接进行。
IServiceCapableConnection :获取有效连接。代码中先获取到连接实例,然后判断是否是有效连接并强制类型转换,之后调取客户端相应函数。
IClient :客户端对象代表某单一客户端。一个客户端可以和同一主机下不同的域分别建立连接。客户端对象和HTTP session 很相像。可以使用IClientRegistry.newClient(Object[])方法来创建IClient对象。
ApplicationAdapter:ApplicationAdapter是应用层级的IScope。若要处理流进程,需实现 IStreamAwareScopeHandler接口中的相应处理方法。ApplicationAdapter还提供了有效的事件处理机制,来进行截取流、确认用户等操作。同时,其子类中引入的方法均可在客户端通过 NetConnection 调取。在Aodbe 的FMS 中必须在服务器端维护客户端对象,与之相较,Red5 为您的远程请求提供了更加方便快捷的操作方法。
- 简单实例
- //创建NetConnection实例
- var netConn:NetConnection = new NetConnection();
- //指定rtmp地址,并且向服务器传递一个参数值"hello"
- netConn.connect("rtmp://localhost/chatroom","hello");
- //添加NetStatus事件监听连接
- netConn.addEventListener(NetStatusEvent.NET_STATUS,function connStatus(e:NetStatusEvent):void{
- switch(e.info.code){
- //连接成功
- case "NetConnection.Connect.Success":
- l_connStatus.text = "连接成功";
- break;
- //服务器断开
- case "NetConnection.Connect.Closed":
- l_connStatus.text = "连接断开";
- break;
- //能连上,但被拒绝访问
- case "NetConnection.Connect.Failed":
- l_connStatus.text = "连接拒绝";
- break;
- default:
- break;
- }
- });
command
参数中指定的方法时,这些参数将被传递给该方法
- /**
- * 发送消息
- * */
- protected function sendMsg():void
- {
- netConn.call("sendMessage",new Responder(function result():void{
- }),uName,txt_msg.text);
- }
- public void sendMessage(String userName,String message){
- ....
- }
- new Responder(function result(str:String):void{
- ....
- })
- //指定连接client,方便red5调用当前客户端的方法
- netConn.client = this;
- /**
- * 【供red5调用的方法】
- * 客户端与red5连接时,red5向客户端返回的消息
- * */
- public function connection_msg(str:String):void{
- Alert.show(str);
- }
- public boolean appConnect(IConnection arg0, Object[] arg1) {
- callClient(arg0,"通知客户端连接成功");
- return super.appConnect(arg0, arg1);
- }
- /**
- * Function : red5调用客户端connection_msg方法,返回相应信息
- * @author : bless<505629625@qq.com>
- * @param conn
- * @param str
- */
- private void callClient(IConnection conn,String str){
- if(conn instanceof IServiceCapableConnection){
- IServiceCapableConnection sc = (IServiceCapableConnection) conn;
- sc.invoke("connection_msg", new Object[]{str});
- }
- }
- public boolean appConnect(IConnection arg0, Object[] arg1) {
- //通知其它用户该用户上线
- notifyAppConnect(arg0.getScope(),"用户A上线啦");
- }
- /**
- * Function : 通知其它客户,用户上线信息
- * @author : bless<505629625@qq.com>
- * @param scope
- */
- private void notifyAppConnect(IScope scope,String userName){
- //遍历所有链接到服务器的客户端
- Collection<Set<IConnection>> col = scope.getConnections();
- for (Set<IConnection> set : col) {
- for (IConnection iConnection : set) {
- //通知有所客户端上线用户信息
- if(iConnection instanceof IServiceCapableConnection){
- IServiceCapableConnection sc = (IServiceCapableConnection) iConnection;
- sc.invoke("otherConnection_msg", new Object[]{userName});
- }
- }
- }
- }
- public class HelloRed5 extends ApplicationAdapter implements IScheduledJob{
- public boolean appStart(IScope arg0) {
- System.out.println("启动 appStart");
- //添加计划任务
- this.addScheduledJob(10000, this);
- return super.appStart(arg0);
- }
- /**
- * IScheduledJob接口实现方法
- */
- @Override
- public void execute(ISchedulingService arg0)
- throws CloneNotSupportedException {
- //运行定时任务的实际方法
- callEvery(this.getScope(),"运行下计划任务...");
- }
- }