服务器端:
red5的项目的建立与tomact非常的相似.
1、在 Red5的安装路径C:Program FilesRed5webapps下建立自己的项目文件夹:
2、将C:Program FilesRed5doctemplatesmyapp下的文件夹WEB-INF复制到自己的项目中,WEB-INF里是red5主要的项目配置文件。
3、 在WEB-INF下建立classes以及src文件夹。
4、在项目根目录下建立Eclipes项目。classes为编译目录,src为源码目录。
5、导入red5 jar包。
6、修改配置文件:
web.xml文件
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<web-app
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2eehttp://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<display-name>MysampleRed5application</display-name>
<context-param>
<param-name>globalScope</param-name>
<param-value>default</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/red5-*.xml</param-value>
</context-param>
<context-param>
<param-name>locatorFactorySelector</param-name>
<param-value>red5.xml</param-value>
</context-param>
<context-param>
<param-name>parentContextKey</param-name>
<param-value>default.context</param-value>
</context-param>
<!--如果不注释需要导入log4j的jar包。。。。。。。一定小心
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/log4j.properties</param-value>
</context-param>
-->
<context-param>
<param-name>webAppRootKey</param-name>
<param-value>/chatApp</param-value>
</context-param>
<!--
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--removethefollowingservlettagsifyouwanttodisableremotingforthisapplication-->
<servlet>
<servlet-name>gateway</servlet-name>
<servlet-class>org.red5.server.net.servlet.AMFGatewayServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gateway</servlet-name>
<url-pattern>/gateway</url-pattern>
</servlet-mapping>
<security-constraint>
<web-resource-collection>
<web-resource-name>Forbidden</web-resource-name>
<url-pattern>/streams/*</url-pattern>
</web-resource-collection>
<auth-constraint/>
</security-constraint>
</web-app>
red5-web.xml
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEbeansPUBLIC"-//SPRING//DTDBEAN//EN""http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<beanid="placeholderConfig">
<propertyname="location"value="/WEB-INF/red5-web.properties"/>
</bean>
<beanid="web.context"
autowire="byType"/>
<beanid="web.scope"
init-method="register">
<propertyname="server"ref="red5.server"/>
<propertyname="parent"ref="global.scope"/>
<propertyname="context"ref="web.context"/>
<propertyname="handler"ref="web.handler"/>
<propertyname="contextPath"value="${webapp.contextPath}"/>
<propertyname="virtualHosts"value="${webapp.virtualHosts}"/>
</bean>
<!-------项目的主类--------->
<beanid="web.handler"
singleton="true"/>
<!--thiswillsupportcallingmethodsthrough"myhandler.<methodName>"-->
<!--
<beanid="myhandler.service"
singleton="true"/>
-->
</beans>
red5-web.properties
webapp.contextPath=/chatApp
webapp.virtualHosts=localhost,127.0.0.1
7、建立程序的入口类
Application.java
packagecom.papaya;
importorg.red5.io.utils.ObjectMap;
importorg.red5.server.adapter.ApplicationAdapter;
importorg.red5.server.api.IScope;
importcom.papaya.VO.MapConventPojo;
importcom.papaya.VO.User;
publicclassApplicationextendsApplicationAdapter
{
publicStringsayHello(Stringname)
{
System.out.println("hello"+name);
return"hello"+name;
}
publicbooleanappStart(IScopescope)
{
System.out.println("聊天服务器启动了!!!!");
returntrue;
}
publicObjectsendVo(ObjectMapmessage)
{
Useruser=newUser();
MapConventPojo.Convent(message,user);
System.out.println(user.getAge());
System.out.println(user.getName());
System.out.println(user.getSchool());
returnuser;
}
}
8、建立客户端flash类
packagecom.renaun.samples.net
{
importcom.game.Logger;
importflash.events.AsyncErrorEvent;
importflash.events.Event;
importflash.events.IEventDispatcher;
importflash.events.IOErrorEvent;
importflash.events.NetStatusEvent;
importflash.events.SecurityErrorEvent;
importflash.net.NetConnection;
importcom.game.Logger;
/**
*Note:ThisclasswasdynamicinActionScript2.0butisnowsealed.
*Towritecallbackmethodsforthisclass,youcaneitherextendthe
*classanddefinethecallbackmethodsinyoursubclass,oryoucan
*usetheclientpropertytorefertoanobjectanddefinethecallback
*methodsonthatobject.
*/
dynamicpublicclassFMSConnectionextendsNetConnectionimplementsIEventDispatcher
{
//--------------------------------------------------------------------------
//
//Constructor
//
//--------------------------------------------------------------------------
publicstaticconstSUSSESS:String="success";
publicstaticconstFAILURE:String="Failure";
/**
*Constructor
*/
publicfunctionFMSConnection()
{

super();
}
publicvarclientID:Number;
//--------------------------------------------------------------------------
//
//Methods
//
//--------------------------------------------------------------------------
/**
*Connect
*/
overridepublicfunctionconnect(url:String, args):void
{
//SetobjectencodingtobecompatiblewithFlashMediaServer
this.objectEncoding=flash.net.ObjectEncoding.AMF0;
NetConnection.defaultObjectEncoding
//Addstatus/securitylisteners
this.addEventListener(NetStatusEvent.NET_STATUS,netStatusHandler);
this.addEventListener(SecurityErrorEvent.SECURITY_ERROR,netSecurityError);
this.addEventListener(AsyncErrorEvent.ASYNC_ERROR,asyncErrorHandler);
this.addEventListener(IOErrorEvent.IO_ERROR,ioErrorHandler);
//TODOdoesnotpass argsintothesuperfunction
super.connect(url);
}
/**
*setID
*/
publicfunctionsetId(id:Number):*
{
Logger.debug("FMSConnection::setId:id="+id);
if(isNaN(id))return;
clientID=id;
return"Okay";
}
/**
*StatusHandlerfortheNetConnectionclass
*/
privatefunctionnetStatusHandler(event:NetStatusEvent):void
{
switch(event.info.code){
case"NetConnection.Connect.Success":
Logger.debug("FMSConnection:netStatusHandler:Success:connected:"+this.connected);
dispatchEvent(newEvent(FMSConnection.SUSSESS));
break;
case"NetConnection.Connect.Failed":
Logger.debug("FMSConnection:netStatusHandler:Failed:connected:"+this.connected+"-"+event.info.code);
dispatchEvent(newEvent(FMSConnection.FAILURE));
break;
default:
Logger.debug("FMSConnection:netStatusHandler:code:"+event.info.code);
break;
}
}
privatefunctionnetSecurityError(event:SecurityErrorEvent):void{
Logger.error("FMSConnection:netSecurityError:"+event);
}
privatefunctionasyncErrorHandler(event:AsyncErrorEvent):void{
Logger.error("FMSConnection:asyncErrorHandler:"+event.type+"-"+event.error);
}
privatefunctionioErrorHandler(event:IOErrorEvent):void{
Logger.error("FMSConnection:asyncErrorHandler:"+event.type+"-"+event.text);
}
}
}