`
唐朝
  • 浏览: 260846 次
  • 性别: 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  
拜读,已测试成功

相关推荐

    抛弃LCDS和FMS,在tomcat下开发Red5应用(第十一篇)-电子白板协同浏览

    标题中的“抛弃LCDS和FMS,在tomcat下开发Red5应用(第十一篇)-电子白板协同浏览”表明本文将介绍如何在不使用LCDS(LiveCycle Data Services)和FMS(Flash Media Server)的情况下,利用Tomcat服务器来开发一个基于...

    抛弃LCDS和FMS,在tomcat下开发Red5应用(第十二篇)-电子白板桌面共享

    NULL 博文链接:https://tj007-bo.iteye.com/blog/299376

    Flex + LCDS + Java 利用Eclipse Plugin开发Flex入门教程

    首先,你需要准备相应的开发环境,包括Eclipse 3.3、FlexBuilder3插件、MyEclipse 6.0、LCDS软件以及Tomcat 5或更高版本的Web服务器。MyEclipse是一个强大的Java开发工具,用于管理和部署J2EE项目。FlexBuilder3则...

    Flex + LCDS + Java

    在开始开发Flex + LCDS + Java应用程序之前,你需要准备以下开发环境: 1. Eclipse 3.3:这是一个流行的Java集成开发环境。 2. FlexBuilder3 beta2插件版:这是Eclipse的一个插件,用于Flex开发。 3. MyEclipse 6.0...

    myeclipse6.5+flex 3 + tomcat6.0 + ds-console.war环境搭建

    在本文中,我们将深入探讨如何搭建一个基于MyEclipse 6.5、Flex 3、Tomcat 6.0和ds-console.war的开发环境。这个环境主要用于开发和部署使用Flex前端与Java后端交互的应用程序,特别是通过LCDS(LiveCycle Data ...

    Flex学习之配置篇-如何在Eclipse中开发Flex

    ### Flex学习之配置篇——如何在Eclipse中开发Flex #### 一、Flex的安装与配置 ##### 1. 安装方式 Flex 的安装有两种主要的方式:直接安装 FlexBuilder 或是在 MyEclipse 下安装 FlexBuilder 插件。推荐后者,...

    Flash Builder4 下 LCDS + JAVA 配置方法详解

    本文旨在详细介绍如何在Flash Builder 4环境下完成LCDS与Java的配置过程,以实现动态数据交换及服务端功能开发。文中将涵盖以下主要步骤: 1. **安装Java与Tomcat** 2. **安装LCDS ES3** 3. **配置Flash Builder 4*...

    Flex + LCDS + Java 入门教程

    Java 能够运行在几乎所有的操作系统上,这使得它成为了企业级应用开发的理想选择。Java 语言具有丰富的类库支持,可以方便地进行网络编程、数据库访问、图形界面设计等工作。此外,Java 平台还包括一系列工具和服务...

    Flex-P-LCDS-P-Java.rar_flex

    在实际开发中,Flex可以通过LCDS与Java的EJB、Spring等框架无缝对接,实现服务的动态发现和调用。同时,LCDS还提供了数据推送功能,通过Server-Sent Events或WebSocket,服务器能够主动向客户端推送更新,这对于实时...

    FLEX LCDS 经典入门

    在部署项目时,确保Java编译后的class文件位于Flex LCDS项目下的webroot/WEB-INF/classes目录,以便服务器能够正确加载和执行。在MyEclipse中,你可以方便地发布整个项目到Tomcat服务器,完成部署。 总之,Flex ...

    Flex-LCDS-Java.rar_LCDS_flex_flex java

    Flex、LCDS(LiveCycle Data Services)和Java的结合是Adobe Flex开发中常见的技术栈,主要用于构建富互联网应用程序(Rich Internet Applications,RIAs)。本文将深入探讨这些技术及其相互之间的协同工作方式。 ...

    置flex开发环境(MyElipse6.0_Eclipse3.3_FlexBuilder3_LCDS

    【置flex开发环境(MyElipse6.0_Eclipse3.3_FlexBuilder3_LCDS)】这篇描述主要介绍了如何配置一个完整的Flex开发环境,包括所需软件、安装步骤以及在MyEclipse6.0中创建和部署Flex项目的详细流程。 1. **所需软件**...

    flex与Java及tomcat整合开发

    随着互联网技术的发展,Flex作为一种基于Adobe Flash平台的应用程序框架,凭借其强大的界面设计能力和高性能的表现效果,在富客户端应用开发领域占据了一席之地。Java作为服务器端的主流开发语言之一,与Flex的结合...

    FLEX+JAVA+LCDS完全配置

    通过本文的详细介绍,我们不仅了解了Flex、LCDS以及Java的基本概念和发展背景,还深入学习了如何在Eclipse环境下搭建开发环境,并具体介绍了创建Flex LCDS项目的步骤。对于初学者而言,这些知识点将有助于快速上手并...

    lcds develop guide

    LCDS是Adobe为Flex、AIR等应用提供数据处理和后端服务的一套解决方案,其主要功能包括数据同步、事务处理、数据持久化、实时通信等,尤其适用于构建具有复杂数据交互需求的RIA(Rich Internet Application)。...

Global site tag (gtag.js) - Google Analytics