logo资料库

red5开发指南.pdf

第1页 / 共23页
第2页 / 共23页
第3页 / 共23页
第4页 / 共23页
第5页 / 共23页
第6页 / 共23页
第7页 / 共23页
第8页 / 共23页
资料共23页,剩余部分请下载后查看
目录
一、Red5介绍及安装
二、编写运行第一个程序
三、远程调用
四、shareObject共享对象
五、服务器自动执行计划
六、录制播放视频
七、Scope与Room讲解
八、视频播放
附录
作者:周英科 email:li_li_li87222@163.com.qq:543246541 入门教程 Red5Red5Red5Red5 简介: 在 flex,java 盛行天下时 red5 把二者连为一体成为更强的强者,为即时通信,流媒体开发 , 网络在线游戏提供了一个简单易行的方案。越来越多的公司把这个方案当成了首先,熟悉相 关技术的人才的缺少也就成了发展的障碍,而相关资料的奇缺成了技术人员成长的障碍。 本书注重实用,着眼入门,用大量实际的例子力求带领您进入 flex,red5 结合开发的天堂。 没一个列子都是精心挑选,每一个列子都代表着一个知识点,每一个列子都将成为您以后项 目的 一 部 分 。 当 然 这 是 入 门 级 别 的 书 籍 , 不 可 能 把 所 有 的 相 关 知 识 都 讲 到 , java,flex,spr ing,mina 等等等等都 red5 相关,如果要对每一个点讲解那将是一个系列,而不是 一本书。为了突出重点,本书只讲解把这些联系起来的纽扣 red5,并讲解如何利用 red5 开 发项目。 内容包括 red5 的安装,red5 开发中各种概念,各种问题的解决方案,开发工具的使用等 等,但有详有略,如工具的使用只讲解了书本中需要用到的相关知识。最后书本还有数个完 整的列子,也是实际开发中常用的列子,如聊天程序,播放视频程序。 作者:周英科 email:li_li_li87222@163.com.qq:543246541 1
目录: 一.Red5 介绍及安装: Red5 介绍 安装 red5 二.编写运行第一个程序 编写服务器端 编写客户端 运行自己编写的程序 三.远程调用 客户端调用服务器端方法 Red5 调用客户端方法 遍历所有连接到服务器端的用户 好友上线通知 四.sharedObject 共享对象 sharedObject 介绍 游戏中移动同步的原理和简单实现 1 五.服务器执行计划 六.录制播放视频 播放服务器端视频 录制视频 设置视频保存位置 七.利用 scope,room 管理客户端 八.视频播放程序 九.简单聊天程序 附录:开发工具的使用 1 作者:周英科 email:li_li_li87222@163.com.qq:543246541 2
一.Red5Red5Red5Red5 介绍及安装 1. Red5 介绍 Red5是一个采用 Java 开发开源免费的的 Flash 流媒体服务器,功能和 Adobe 的 fms(Flash Media Server)相同,可以上官方网站 http://www.osflash.org/red5免费下载并使用。它支持把音频(MP3) 和视频(FLV)转换成播放流,在下载的同时播放流; 录制客户端播放流(只支持 FLV),把摄像头,麦 克风等传入的视频音频录制保存到服务器;共享对象;现场直播流发布;远程调用。Red5使用 RSTP 作为 流媒体传输协议。 Red5的功能使其在许多领域得到应用。如视频播放网站,远程教育,视频会议程序,聊天程序,网络 游戏等等。 免费开源使软件更加容易扩展,下载后你可以对源代码进行修改;更加经济,比起fms 高昂的费用 red5 能为一般的应用节约大笔费用;服务器端的java语言比起 fms 服务器端的 actionscript2语言更加面向对 象更加成熟。这使得 red5还没到版本1就已经红遍世界。 2.red5 安装 第一步 上 java.sun.com 下载 jdk6 并安装。如果不是安装在默认路径请设置 classpath和 path。设 置 classpath和 path 的方法请参考其他 java 的资料 。 第二步 上 http://www.osflash.org/red5下载 Red5 v0.7.0 Final 的 window 安装版。点击下载到 的 exe 文件即开始安装,安装过程中选择要把 red5安装到的目录。安装结束后打开浏览器输入 http://localhost:5080/如果能打开显示“Red5 Test Page”表示安装成功。安装成功后可以运行查看 red5自带的例子。 第三步 red5的启动和关闭。安装版的 red5默认情况下会在计算机启动时启动,如果想关闭自启动可以 右击我的电脑->管理->服务和程序,找到 red5的那项把启动方式的自动启动改为手动或其他的。更改了 启动方式后可以找到 red5的安装目录下的 wrapper 目录下的 Red5.bat 文件,双击即可启动,这样可以 从窗口看到客户端连接的情况。关闭窗口即可关闭 red5,也可以双击 StopRed5-NT.bat 关闭服务程序。 二.编写运行第一个程序 第一个程序的运行是学习的莫大回报,也是继续下面学习的关键,只有顺利的运行了第一个程序才会 更加信心百倍的去学习更深一步的知识。 Red5+flex 或 red5+flash 的项目一般都包括服务器和客户端俩个部分,服务器用 java,客户端用 flex 或 flash。编写并编译完服务器端代码后需要把服务器的的应用部署到 red5的 webapps 目录下这和 传统的 java应用没区别,客户端可以直接点击 flash 文件运行。 下面开始第一个程序的编写,它分成服务器和客户端俩部分,以后的程序也都安这种方式分。 1.编写服务器端 打开 eclipse 新建 java 工程或 javaee 工程 chapter2(如果不熟悉 eclipse 请参考附件 eclipse 的 使用 )。 把 red5安装目录下的 red5.jar 以及 lib 目录下的 jar 都添加到工程的类库中。 新建包 first,然后新建类,类名称为 Application 并继承 ApplicationAdapter。类的代码如下: package first; import org.red5.server.adapter.Applic ationAdapter; import org.red5.server.api.IConnection; public class Application extends ApplicationAdapter { public boolean appConnect(IConnection conn, Object[] args) { 作者:周英科 email:li_li_li87222@163.com.qq:543246541 3
System.out.println(" 连接"); return true; } public String change(String str){ System.out.println(" 客户端调用服务器"); return str.toUpperCase();// 传入的字符串转换成大写后返回 } } 2.编写客户端 打开 flexbuilder3 新建 flex 工程(具体 flexbuilder 的使用请参考附录),名字取名为 chapter2。 打开项目中 chapter2.mxml。chapter2.mxml 的代码如下:
} } ]]> 3.部署运行程序 进入 red5 的安装目录下的 webapps 下 ,复 制 test 文件夹,把复制的文件夹改名为chapter2, singleton="true" class="org.red5.samples.services.EchoService" 删除 chapter2\WEB-INF 目录下的文件夹。 把服务器项目下的 classes 目录下的文件夹 first 拷贝到 chapter2\WEB-INF 下。 把 red5-web.properties 中的/test 替换为/chapter2。 把 red5-web.xml 中 的 删除。 把 org.red5.server.webapp.test.Application 替换为 first.Application。 把 web.xml 中的 /test 替换 为 /chapter2 把 /tlds/c/WEB-INF/tlds/c.tld 删除 注 意 :webapps 下的文件夹名 chapter2,red5-web.properties 中的 chapter2,web.xml中的 chapter2 要保持相同,如果一个改了,其他的也改成相同的,所有以后的工程都这样。 重新启动 red5 在 flexbuilder3 中选择运行菜单中的运行项运行 chapter2。在文本框里输入字符串,点击连 接按钮,然后点击调用方法按钮。上面如果显示出输入框里的字符串的大写表示运行正常。 服务器端类有俩个方法,appConnect 类从 ApplicationAdapter 继承来,当 flash 连接时触发, 可以返回 true 或 false。True表示接受客户端的请求,false 表示拒绝客户端的请求。如果拒绝那么以后 flash 和服务器端的交互服务器都不会理会,所以当想拒绝某些ip 的请求时只需有在用户连接时检查它的ip 是否在拒绝 ip 之内,如果在就返回 false,那样就可以拒之门外了。change 是自己定义的,客户可以直 接调用的一个远程方法。作用是把客户传入的参数变成大些后返回,此处目的在于运行一个 red5 和 flex 交互的过程,并没有检查传入的参数是否有大写或都已经是大写。 客户端的代码稍多些,位于 之外的是图形界面的 代码,包括俩个按钮,一个输入框,一个显示文本,这就不详细讲解了,注意给按钮添加事件监听器。过 程是这样的,用户点击连接,按钮的监听器 clickConnect响应,conn.connect(rtmpURL)连接到服务 器,在服务器和客户端建立一条信息交流的通道。当这条通道打通时 netStatus 执行,把是否是打通的开 关 isConnectSuccess 设置为通的。当用户再点击调用按钮时,通过这条通道调用服务器端的方法 conn.call("c hange",responder,str.text) 。传给服务器字符串 str.text,当服务器端方法执行完后把返 回值给 responder 定义时的方法 resultFun,这样一个客户端与服务器交互的过程完成。 三.远程调用 通过 red5 服务器端和客户端可以直接通过方法调用来交互,这是非常方便的(想想你在一 作者:周英科 email:li_li_li87222@163.com.qq:543246541 5
个类里面方法调用发方便性吧),服务器调可以用客户端的方法,客户端也可以调用服务器 端的方法。其实上面的例子就是通过方法调用实现的。 1.客户端调用服务器端方法 通过 red5 可以从客户端直接调用服务器上 java 编写的方法。调用时指明被调用的方法 名称,如果有返回值则需要指明返回值处理的 responder,如果被调用的方法有参数则需要 "change" "change" 传入参数。 可以引用第一章的例子,conn.call("change" "change",responder,str.text); public public 表示客户端调用服务器端的名称为change的方法,查看 java 中 change的定义public public String change(String str){//函数体 }发现参数是 java 中 String 类型的;调用时传入的 str.text 是 actionscript 中 String 类型;假如 change 有多个入口参数,则可以把参数列在 str.text 后 面 , 并用''," 隔开。返回值由 responder 处理,change 返回值是 String 类型的,要求 responder 定义 时的函数 resultFun 的入口参数是 String 类型。 调用过程中需要注意的是参数类型的对应。具体可以看下列表 Java null int/float double boolean String List Map Bean actionscript null Number Double Boolean String Array Object Object 表说明假如 java 传给 flash 的参数是自定义 Bean类型时,客户端接收到的是 Object 类型 当被调用的方法没有返回值时把 responder 设置为 null 。具体怎么实现就不再雷述,请 看第二章的例子。 2.服务器调用客户端方法 不带返回的调用 新建 eclipse 工程 chapter3,并建 立 包 first ,在 包 里 新 建 一 个 类 Application 并继 承 ApplicationAdapter。Application 到代码如下: package first; import org.red5.server.adapter.Applic ationAdapter; import org.red5.server.api.IConnection; import org.red5.server.api.service.IServiceCapableConnection; public class Application extends ApplicationAdapter { @Override public boolean appConnect(IConnection arg0, Object[] arg1) { // TODO Auto-generated method stub callClient(arg0); return true; } private void callClient(IConnection conn){ if (conn instanceof IServiceCapableConnection) { IServiceCapableConnection sc = (IServiceCapableConnection) conn; sc.invoke("clientMethod", new Object[]{"One", 1}); 作者:周英科 email:li_li_li87222@163.com.qq:543246541 6
} } } 复制 webapps 下的 chapter2 文件夹,并改名为 chapter3,把工程下 class 目录下的 first 拷贝覆盖以前 的 first , 把 red5-web.properties 中的 /chapter2,替换为 /chapter3。把 web.xml 中的 /chapter2替换为/chapter3 重启 red5。 新建 chapter3 客户端项目,chapter.mxml 代码如下: 点击调试程序运行客户端,然后点击连接按钮可以发现输出“接收 One2”表示服务器调用 客户端到方法成功。 服务器端还是只有俩个方法,当客户端连接时服务器调用 appConnect,在 appConnect里 调用 callClient 。在callClient 中服务器调用客户端的方法 clientMethod,并传给客户端俩个参数,一个 字符类型,一个数字类型。只有IServiceCapableConnection 类型的连接才可以调用客户端方法,所以 要先对连接类型进行强制转换。 再看客户端,有三个方法,因为不需要处理连接状态的变化事件所以用个空方法以便简单突出重点。用 户点击按钮连接,调用 clickConnect 方法连接服务器。还有一个方法给服务器调用的,这个方法附着在 conn.client 上。因为 ActionScript3 中 NetConnection 是封闭的,无法直接把方法附着在其上,但他 的一个属性 client 是 Object 类型的,是动态的。 服务器不但可以调用客户端的方法,还可以把客户端方法处理的值返回给服务器。 作者:周英科 email:li_li_li87222@163.com.qq:543246541 7
理服务器调用客户端方法有返回值就就必须实现 IPendingServiceCallback 接口,并调用方式 改 为 sc.invoke("clientMethod", new Object[]{"One", 1},this);this 是 任 意 一 个 实 现 IPendingServiceCallback 接口的类,在接口的 resultReceived 方法中处理返回值。现在把上面 的类改成下面样子 package first; import org.red5.server.adapter.Applic ationAdapter; import org.red5.server.api.IConnection; import org.red5.server.api.service.IPendingServiceCall; import org.red5.server.api.service.IPendingServiceCallback; import org.red5.server.api.service.IServiceCapableConnection; public class Application extends ApplicationAdapter implements IPendingServiceCallback{ @Override public boolean appConnect(IConnection arg0, Object[] arg1) { callClient(arg0); return true; } private void callClient(IConnection conn){ if (conn instanceof IServiceCapableConnection) { IServiceCapableConnection sc = (IServiceCapableConnection) conn; sc.invoke("clientMethod", new Object[]{"One", 1},this); } } public void resultReceived(IPendingServiceCall arg0) { System.out.println(" 来自客户端到返回:"+arg0.getResult()); } } 把客户端的 private function clientMethod(str:String,num:Number):void{ Alert.show("接收"+str+(num+1)); } 改成 private function clientMethod(str:String,num:Number):String{ Alert.show("接收"+str+(num+1)); Return "客户端返回来的字符串"; } 测试可以从 red5 的框里看到输出“客户端返回来的字符串" 3.遍历所有连接到服务器端的用户 遍历所有链接到服务器的客户端是常常的事,如好友上线,则要及时把这个消息通知给 在线的人员。 Red5 通过 IConnection.getscope()得到所在 scope,通过 scope 可以得到连接到这个 scope 的所有客户的连接。在得到连接后就可以通过连接调用客户端方法。如调用每个客户端的 clientMethod 方法一遍可以把服务器改成下面的样子 package chapter2; import java.util.Iterator; 作者:周英科 email:li_li_li87222@163.com.qq:543246541 8
分享到:
收藏