刚刚弄完教育版的开发,接着又是基本版的升级,主要还是为了配合新版的流媒体服务器,工作任务真是衔接的够紧密-_-!,经过测试,原来建立在 red5_0.6.3,和fms2上的服务器端应用程序,已经不能直接在新版服务器上直接运行了,所以不得不仔细研究新版服务器的变化,以便修改相应的服务器代码。
red5 v0.7.0虽然早在2008年2月23号就已经发布了,不过前段时间,又是教育版,又是定制,所以一直也没时间去研究新的red5,再加上当时公司也暂时没这个要求,所以也没太在意,不过一下从0.6.3更新到0.7.0,跨度还是很大的,感觉有点仓促,结果造成服务器端的代码已经不能正常使用了,不过研究了一个上午,发现问题还是出现在服务器的配置上,好了,不说废话了,进入正题:
从这次开始,我将会从red5的安装开始陆续介绍一些基本的功能在red5上的实现,包括数据传输,服务器的广播,服务器和客户端的互相调用,服务器端的文件操作,服务器端的remoting技术等。
“安装Red5”
首先删除老版red5,然后在http://osflash.org/red5/070final上下载最新的red5。点击 Java 6 Version (hosted by: mediafire.com) 下载windows版的安装程序,其他平台的安装太麻烦,不过在使用上没什么区别,所以下的是windows平台的。
先看看新版的变化:
Major changes since 0.6.3:
*
Initial Edge/Origin clustering support for multiple Edges with a single Origin
*
New Flex admin tool
*
Added a multi-threaded ApplicationAdapter that allows multiple clients to connect simultaneously to the same application
*
Added stream listeners that can get notified about received packets
*
Fixed a critical memory leak bug in networking due to MINA ExecutorFilter
*
Added new Flash Player 9 statuses NetStream.Play.FileStructureInvalid and NetStream.Play.NoSupportedTrackFound
The complete changelog can be found in the “doc” directory after the installation.
简单看了看大致是说增加了有关集群技术的内容(好像目前不能用,也用不上),然后就是增加了一个admin tool,后来发现这个根本不能用,也有可能是我安装的问题,不过不影响正常试用,所以不管他了,另外还有一些别的,以后有时间再研究,呵呵。下载完成后正常安装就可以了。
一切的开始“myapp”
在red5的安装目录(\doc\templates \ )下找到myapp文件夹,把它整个拷贝到red5安装目录的webapps文件夹下,然后重命名为“templates_myapp”。这个文件夹中包含的是一个red5端应用程序配置的模板,对这个模板进行简单的修改,就可以将我们编写的应用程序正常的运行在red5服务器上。具体修改方法如下:
1、修改templates_myapp\WEB-INF下的四个文件,只要看到“myapp”就将其替换成“templates_myapp”。
2、修改red5-web.properties文件中的webapp.virtualHosts为*,localhost, 127.0.0.1
3、修改red5-web.xml中的class="the.path.to.my.Application"为class="org.red5.server.adapter.ApplicationAdapter"
到此在red5v0.7.0以前的版本上一个自己的服务器应用程序已经配置好了,不过在0.7版中,像这样配置,在连接时仍然会提示找不到服务器应用程序,后来通过对比其他的实例文件,发现除了上述的改动外,还有一个比较特殊的改动,去掉web.xml中的下面一段话。
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
到此,一个服务器应用程序的配置就完成了。在客户端,你可以像连接一个默认的fms应用程序一样去连接他。
要想具体了解每个配置的含义,可以参看red5自己的文档。
class="org.red5.server.adapter.ApplicationAdapter"
这个配置可以简单的理解为指定red5工作的入口程序,其实就类似于fms中的application,而类 org.red5.server.adapter.ApplicationAdapter 是red5提供的系统入口,通过对它的扩展,就可以完成自己对于服务器的特殊应用和服务,类似fms中的各种操作都是通过对它的扩展而来的。
一个简单的red5 应用程序:
刚才讲了半天配置,现在开始真正进入red5 的开发,下面做了一个简单的red5应用程序用来说明开发red5的一般流程。
打开eclipse,新建一个工程,引入库文件red5.jar,然后新建包org.red5.test,在包内新建一个文件Application.java,打开它进行编辑。
由于red5是完全由java语言开发的应用程序,所以代码对应java程序员来说,应该是很简单的,不过个人感觉,做flash开发的,懂java应该还是不多,所以介绍的比较繁琐,java程序员可以跳过,直接看源码。
首先声明包package org.red5.test;
然后导入相应的库文件:(具体功能和用法可以自己看文档)
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.IClient;
import org.red5.server.api.Red5;
扩展类ApplicationAdapter:
public class Application extends ApplicationAdapter {
}
覆盖父类方法
@Override
public boolean connect(IConnection conn, IScope scope, Object[] params) {
}
在里面添加代码
public boolean connect(IConnection conn, IScope scope, Object[] params) {
System.out.println("connect");
IClient client = conn.getClient();
String uid = client.getId();
System.out.println("connect->uid:"+uid);
System.out.println("welcome to red5 world !");
return true;
}
然后保存。完整的代码如下:
package org.red5.test;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.IClient;
import org.red5.server.api.Red5;
public class Application extends ApplicationAdapter {
private IScope app = null;
public boolean appStart(IScope __app){
app = __app;
super.appStart(app);
return true;
}
@Override
public boolean connect(IConnection conn, IScope scope, Object[] params) {
System.out.println("connect");
IClient client = conn.getClient();
String uid = client.getId();
System.out.println("connect->uid:"+uid);
System.out.println("welcome to red5 world !");
return true;
}
}
发布应用程序
点击File=>Export=>Java=>JAR file=>选择导出路径(注意:要以\Red5\webapps\下的目录名命名导出的文件名)
在\templates_myapp\WEB-INF文件夹下新建文件夹“lib”,将刚才导出的文件拷贝到该目录下
双击wrapper下的Red5.bat启动red5 服务器(注意不要关闭调试窗口)
客户端调试程序:
用flash8连接的方法很简单,我就不举例了,这里想尝试用air做下测试(顺带了解下air)。在flex3里新建air项目,命名为templates_myapp,修改文件templates_myapp.mxml为:
<?xml version="1.0" encoding="utf-8"?>
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" title="Red5 Connect Test" creationComplete="appinit()">
<mx:Script>
<![CDATA[
import flash.display.Sprite;
import flash.events.NetStatusEvent;
import flash.events.SecurityErrorEvent;
import flash.media.Video;
import flash.net.NetConnection;
import flash.net.NetStream;
import flash.events.Event;
var command:String="rtmp://192.168.0.163:1935/templates_myapp";//这里注意修改地址为你的red5服务器地址
var mync:NetConnection=new NetConnection();
function netStatusHandler(sevt:NetStatusEvent):void{
var str="_____________________netStatusHandler_____________________\n";
str+="code:"+sevt.info.code+"\n";
str+="level:"+sevt.info.level+"\n";
if(sevt.info.application!=undefined){
str+="application:"+sevt.info.application+"\n";
}
if(sevt.info.description!=undefined){
str+="description:"+sevt.info.description+"\n";
out_txt.text=str;
}
}
function appinit(){
mync.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
}
function serverConnect():void{
out_txt.text="Connectting ... ...";
mync.connect(command);
trace("serverConnect:"+command);
}
]]>
</mx:Script>
<mx:Style>
WindowedApplication
{
background-color:"0xffffff";
background-alpha:"0.5";
}
</mx:Style>
<mx:Label y="100" text="连接状态:未连接" horizontalCenter="0" fontSize="12" fontWeight="normal" id="out_txt" condenseWhite="true" height="150"/>
<mx:Button y="254" label="点击我连接Red5" fontSize="11" fontWeight="normal" horizontalCenter="0" click="serverConnect()"/>
</mx:WindowedApplication>
运行air程序,点击按钮,应该能够得到成功连接服务器的信息。同时观察red5 服务器的调试窗口,是否输出了相应的信息。
上一篇:
关于RED5——配置文件详解 下一篇:
Red5 服务器初探 (互动媒体)