`
唐朝
  • 浏览: 257978 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

抛弃LCDS和FMS,在tomcat下开发Red5应用(第三篇)-ApplicationAdapte

    博客分类:
  • RED5
阅读更多

一个完整的应用过程包括(1)应用程序启动。 (2)客户端建立连接。 (3)允许/拒绝客户端连接。 (4)客户端断开连接。(5)应用程序停止。这几个基本的动作。这些动作都在ApplicationAdapter中进行了实现,我们自己写的类只需要继承该类即可。对比FMS的各个过程,具体见Red5的安装安装版的安装目录下的MigrationGuide.txt文件。该迁移向导对比了FMS和Red5在上述过程中的方法对应。

=============== ===============
FCS / FMS       Red5
=============== ===============
onAppStart      appStart               (1)应用程序启动
                roomStart
onAppStop       appStop               (5)应用程序停止
                roomStop
onConnect       appConnect         (2)客户端建立连接
                roomConnect
                appJoin
                roomJoin
onDisconnect    appDisconnect    (4)客户端断开连接
                roomDisconnect
                appLeave
                roomLeave
=============== ===============

再看如何允许/拒绝客户端连接。FMS提供了方法`acceptConnection` 和`rejectConnection`进行允许和拒绝客户端连接的操作。而在Red5中,允许一个客户端连接不需要特别的操作,只需要在appConnect或roomConnect方法中返回"true"的布尔值就可以了。拒绝客户端连接,只需要调用rejectClient方法就可以了,rejectClient方法可以带一个参数以告知客户端是什么原因拒绝客户端连接。

下面我们通过一个实例来观察上述的各个过程:

假定如下场景:我们在服务器端有一个保存连接当前服务器的用户的列表,以连接时输入的用户名为标示,当有重复的用户名的客户端连接时,服务器拒绝该客户端连接,并告知客户端拒绝连接的原因。

1.修改上一篇的服务器端代码(Application.java):

package red5.example.red5server;   
  
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.red5.server.adapter.ApplicationAdapter;   
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.service.IServiceCapableConnection;
  
public class Application extends ApplicationAdapter { 
	
	List userList = null;
	
	@Override
	public boolean appStart(IScope scope) {
		System.out.println("red5Server--上下文启动...");
		userList = new ArrayList();
		System.out.println("初始化用户列表结束...");
		return super.appStart(scope);
	}
	
	@Override
	public boolean appConnect(IConnection conn, Object[] args) {
		System.out.println("red5Server--有客户端要建立连接...");
		String userName = args[0].toString();
		int cnt = 0;
		for (Iterator iter = userList.iterator(); iter.hasNext();) {
			IConnection element = (IConnection) iter.next();
			if(userName.equals(element.getAttribute("userName").toString()))
			{
				rejectClient("已经有一个"+userName+"在连接中,请使用其他用户名连接...");
			}
			cnt++;
		}
		if(cnt == userList.size())
		{
			conn.setAttribute("userName", userName);
			userList.add(conn);
		}
		//if(cnt == userList.size())
			return super.appConnect(conn, args);
		//else
			//return false;
	}
	
	@Override
	public void appDisconnect(IConnection conn) {
		System.out.println("red5Server--客户端断开连接...");
		for (Iterator iter = userList.iterator(); iter.hasNext();) {
			IConnection element = (IConnection) iter.next();
			if(element.getAttribute("userName").toString().equals(conn.getAttribute("userName").toString()))
			{
				userList.remove(element);
				break;
			}
		}
		//IServiceCapableConnection client = (IServiceCapableConnection) conn;
		super.appDisconnect(conn);
	}
	
	@Override
	public void appStop(IScope scope) {
		System.out.println("red5Server--上下文停止...");
		super.appStop(scope);
	}
}  

 

2.编写客户端代码进行测试(red5client002.mxml):

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

	<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);   
           	}
           	
           	private function netStatus(event:NetStatusEvent):void { 
           		//txtResult.text = "";  
            	var connStatus:String = event.info.code;
            	//Alert.show(connStatus);
            	txtResult.text += connStatus; 
            	if(connStatus == "NetConnection.Connect.Success") {  
            		//登录成功,不做处理
            	}     
            	else if(connStatus == "NetConnection.Connect.Rejected")
            	{
            		//登录被拒绝
            		txtResult.text += event.info.application;
            	}
        	}   
           
        	private function netSecurityError(event:SecurityErrorEvent):void {   
            	Alert.show("netSecurityError: " + event);   
        	}
		]]>
	</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://localhost/red5Server"/>
	<mx:Button x="10" y="64" label="连接到red5服务器" width="240" click="connServer()"/>
	<mx:TextArea x="10" y="94" width="240" height="154" id="txtResult"/>
	
</mx:Application>

 

3.启动tomcat,在浏览器输入http://localhost:8080/red5/red5client002.html ,在输入用户名的文本框中输入“testuser”,点击“连接到red5服务器”按钮,看到结果文本域显示“NetConnection.Connect.Success”,再开一个浏览器,同上操作,可以看到结果文本域里显示“NetConnection.Connect.Rejected已经有一个testuser在连接中,请使用其他用户名连接...NetConnection.Connect.Closed”。

 

最后停止tomcat服务器,再观察tomcat的控制台,应用上下文将整个过程的输出语句都打印了一遍,完成了整个过程。

 

下一篇将讲解Flex客户端和后台方法相互调用。

分享到:
评论
2 楼 daveyking 2012-12-05  
客户端代码不太懂,是在哪写的?flash actionscript?
1 楼 tianzhan168 2009-10-16  
拜读,已测试成功

相关推荐

Global site tag (gtag.js) - Google Analytics