写这篇文章前先允许我发下牢骚吧,因为这里面的曲折心酸真的难以体会啊,我是第一次弄一个helloworld的东西弄了将近3天 啊,差一点点我都基本要放弃了,可是还是那句老话对啊,坚持就是胜利,果然我胜利了。还有一个就是,感觉现在视频网站也到处都是,flex技术也很多了,干嘛关于red5的资源网上这么少,市面上的书籍更是没有,这样就导致很多刚开始入门的时候会弄很久,然后一没信心就放弃了。 还好我坚持了,庆幸下先 ,还希望以后各位能把自己所会的放到网上来,大家一起学生,千万别像我在入门red5的时候,千辛万苦的找到一个一个pdf的作者,想问问他入门的时候这些东西到底哪里错了,该怎么配,心想也花不了他多少时间,可是谁想到他居然不但不给我说,还说我写的程序是垃圾,集成tomcat没用,在这里强烈的鄙视他,程序届有这种人真是悲哀。 好了,唠叨完了,心情好点了,可以说正事了。
首先我要说的是,我用的是0.6 java6版本的安装包和0.6 war包,包括(Root .war admin.war,echo.war)(在这之前弄了个1.0的包 和0.8的包 都没成功,如果谁成功了告诉我下好吧)
1. 将0.6的windows安装包安装好(D/red5)
2.删除你tomcat重conf里面的catalina文件件,删除work文件夹,删除webapps\ROOT文件夹(因为这里的两个文件夹都是tomcat的,现在你要集成red5,所以删掉,ps:当你配置完下面我要说的所有后重启tomcat时这两个文件会重新的生成)
3.找到你的tomcat的wabapps,然后将那三 个war包放在wapapps下
4重启tomcat(其实现在看来Root.war admin.war echo.war 对于写项目没用,唯一有用的就是 当我们建立自己的项目时会用到root.war 加压后的文件夹里面的一些文件,这些一会说)
5.打开tomcat下webapps\ROOT\WEB-INF\classes,里面的root-web.xml.将里面的所有端口都换成8080,PS:现在看来该这里东西对我们以后写的项目也没影响,该它只是为了访问red5主页或者它里面的例子。
6.再重启tomcat,现在在浏览器中输入:http://localhost:8080 如果出现red5的主页,而不 是以往 我们熟知的tomcat主页就行了。
现在下面的才是真正我们需要的东西:
在myeclipse里面建立我们的项目如图:
前面那两 个包你们不用管,主要是red5.example.red5Server这个包,里面建个类:
import org.red5.server.adapter.ApplicationAdapter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.Red5;
import org.red5.server.api.service.IServiceCapableConnection;
public class Application extends ApplicationAdapter {
private String userName;
//客户端调用的方法
public String callFromClient(String userName) {
System.out.println("ddd");
this.userName = userName;
callClient();
return "Hello:"+userName;
}
//服务器端调用客户端的方法
public void callClient() {
IConnection conn=Red5.getConnectionLocal();
if (conn instanceof IServiceCapableConnection) {
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("callFromServer", new Object[]{"hi,"+userName+" this message from server"});
}
}
}
建好后可定会报错,因为我们要用到red5的jar包 啊,我们还们引入jar包,于是我们来到0.6windows安装版的安装路径下找到red5.jar 把它拷工程的lib下,同时你也去tomcat的root文件夹下的classes里面 的lib的所以jar拷的你工程的离别下 同时你也去tomcat下找到Root文件夹,里面的web-inf下的classes里面的配置文件,除admin echo sosample -web.xml外的文件拷到你工程src下,将tomcat6\webapps\ROOT\WEB-INF下的web.xml 和log4j的配置文件拷到你的项目的web-inf下,覆盖以前的文件。到这里,你的项目基本快要完成了,接下来就是修改里面的 配置。
首先要改的就是web.xml,容器从这里找到你的服务,
将web.xml中的
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>/</param-value>
</context-param>
改成
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>/red5Server</param-value>
</context-param>
然后在src建立以个red5Server.xml文件,类容为:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<bean id="web.context.red5Server" class="org.red5.server.Context">
<property name="scopeResolver" ref="red5.scopeResolver" />
<property name="clientRegistry" ref="global.clientRegistry" />
<property name="serviceInvoker" ref="global.serviceInvoker" />
<property name="mappingStrategy" ref="global.mappingStrategy" />
</bean>
<bean id="web.scope" class="org.red5.server.WebScope"
init-method="register">
<property name="server" ref="red5.server" />
<property name="parent" ref="global.scope" />
<property name="context" ref="web.context.red5Server" />
<property name="handler" ref="web.handler.red5Server" />
<property name="contextPath" value="/red5Server" />
<property name="virtualHosts"
value="*,localhost, localhost:8080, 127.0.0.1:8080" />
</bean>
<bean id="web.handler.red5Server"
class="red5.example.red5server.Application" />
</beans>
想必你们也能明白这里的意思了。
然后这里就非常的重要了,打re5-core.xml,找到里面的:
<bean id="rtmpTransport" class="org.red5.server.net.rtmp.RTMPMinaTransport" init-method="start" destroy-method="stop">
<property name="ioHandler" ref="rtmpMinaIoHandler" />
<property name="address" value="10.30.6.221" />
<property name="port" value="8080" />
<property name="receiveBufferSize" value="65536" />
<property name="sendBufferSize" value="271360" />
<property name="eventThreadsCore" value="4" />
<property name="eventThreadsMax" value="8" />
<property name="eventThreadsQueue" value="-1 " />
<property name="eventThreadsKeepalive" value="60" />
</bean>
看见“address”,这 个地方就是让我纠结2天的东西,这个地址大概意思是说“在这个地址上监听rtmp请求”(这是我个人想法,还没来及看官方文档),这个地址就写你现在本地的ip地址,我之前写的是localhost,让我连了2天都没连通,换成它默认的0.0.0.0也不行。下面的写8080,其实我想知要写个没被占的端口都可以,只要前台在连接的时候写对应的端口就行了。改好后保存。 这样你的 red5项目的服务端就是完事了。
下面写前台吧,我用Flex
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()">
<mx:Script>
<![CDATA[
import flash.net.*;
import flash.events.*;
import flash.utils.*;
import mx.controls.*;
private var nc:NetConnection;
public function connServer():void {
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus);
nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, netSecurityError);
nc.connect(txtServerURL.text,txtUserName.text);
}
public function init():void {
// Alert.show("页面初始化完成!")
nc = new NetConnection();
nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus);
nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, netSecurityError);
nc.connect("rtmp://10.30.6.221:8080/red5Server");
nc.client = this;
//Alert.show("连接完成");
}
private function netStatus(event:NetStatusEvent):void {
var connStatus:String = event.info.code;
Alert.show(connStatus);
if(connStatus == "NetConnection.Connect.Success") {
txtResult.text += "登陆成功";
nc.call("callFromClient",new Responder(callServerMethodResult,callServerMethodFault),Math.random().toString());
}
else if(connStatus == "NetConnection.Connect.Rejected")
{
//登录被拒绝
txtResult.text += event.info.application;
}
else if(connStatus == "NetConnection.Connect.Failed")
{
//登录被拒绝
txtResult.text += event.info.application;
}
}
private function netSecurityError(event:SecurityErrorEvent):void {
Alert.show("netSecurityError: " + event);
}
public function callServerMethodResult(re:String):void {
Alert.show("客户端调用服务器端方法成功,返回结果:"+re);
}
public function callServerMethodFault(fo:Object):void {
Alert.show("客户端调用服务器端方法失败:"+fo.toString());
}
public function callFromServer(re:Object):void {
Alert.show("服务器端调用客户端方法,传递的参数为:"+re.toString());
}
]]>
</mx:Script>
<mx:Label x="10" y="38" text="输入用户名:"/>
<mx:TextInput x="83" y="36" id="txtUserName" width="167"/>
<mx:Label x="10" y="10" text="连接的服务器:"/>
<mx:TextInput x="83" y="8" id="txtServerURL" text="rtmp://10.30.6.221:8080/red5Server"/>
<mx:Button x="10" y="64" label="连接到red5服务器" width="240" click="this.connServer()"/>
<mx:TextArea x="10" y="94" width="240" height="154" id="txtResult"/>
</mx:Application>
这个项目要映射到你的J2EE项目的目录下,比如这里我是映射到red5Server下,输入路径为/red5Server/chart
编写完成后可以直接点Flexbulder3运行,也可以在地址栏中输入:http://localhost:8080/red5Server/chart/chart.html
如果在局域网中测试最好用80端口,因为80默认能穿过防火墙。
运行结果如图:
在看看你的myeclipse后台,肯定输入了ddd符号,这说明前台掉后台的方法成功了。现在就可以进行的需要的red5开发了。
字敲完了,休息了。 如果哪里有错还请原谅,都是带着瞌睡敲的。你可以说出来大家一起研究下,有问题就留言哈。
2012,.03.15
=================================一下是最近做个一个小东西,继续更新中==========================================
建议用red5高版本,因为0.6的是spring2.0
======================2012年3月31:项目更新,用red5 0.8版 ,局域网内测试 上传流量可达80多K,代码在我的资源里 需要的可以去下载==================