`
yuzhongzi81
  • 浏览: 3554 次
文章分类
社区版块
存档分类
最新评论

用red5和flex实现的一个小的聊天程序

 
阅读更多

程序的基本功能

1.用户连接、断开连接

2.显示用户登录列表

3.信息群聊

4.私聊


red5程序:ChatRoom.java

package com.red5;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;

import org.red5.server.adapter.ApplicationAdapter;
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;
import org.red5.server.api.so.ISharedObject;

/**
 * @category 一个简单的聊天程序
 * @author Administrator
 *
 */
public class ChatRoom extends ApplicationAdapter {
	private static Logger log = Logger.getLogger(ChatRoom.class.getName());
	private Map<String, IConnection> clientDic = new HashMap<String, IConnection>();
	
	/**
	 * @category 客户端连接时调用
	 */
	@Override
	public synchronized boolean connect(IConnection conn, IScope scope,
			Object[] params) {
		if(params.length == 0) {
			rejectClient("Must pass the login name.");
		}
		
		String loginname = params[0].toString();
		conn.setAttribute("UserName", loginname);
		
		//如果用户不存在于当前的连接中,则将其加入
		//如果不存在共享对象,则创建
		if(clientDic.keySet().contains(loginname)) {
			rejectClient("The same user has logged in already");
		} else {
			clientDic.put(loginname, conn);
			ISharedObject so = getSharedObject(scope, "UserSO");
			if(so == null) {
				createSharedObject(scope, "UserSO", true);
				so = getSharedObject(scope, "UserSO");
			}
			so.setAttribute("userlist", clientDic.keySet().toArray());
		}
		
		return super.connect(conn, scope, params);
	}

	/**
	 * @category 客户端失去连接时调用
	 */
	@Override
	public synchronized void disconnect(IConnection conn, IScope scope) {
		String loginname = conn.getAttribute("UserName").toString();
		if(loginname != null) {
			if(clientDic.keySet().contains(loginname)) {
				clientDic.remove(loginname);
				ISharedObject so = getSharedObject(scope, "UserSO");
				if(so != null) {
					so.setAttribute("userlist", clientDic.keySet().toArray());
				}
			}
		}
		super.disconnect(conn, scope);
	}
	
	/**
	 * @category 发送全局消息,所有上线的人都能够看到
	 * @param params
	 */
	public void sendMessage(List<String> params) {
		IConnection conn = Red5.getConnectionLocal();
		IScope scope = conn.getScope();
		ISharedObject so = getSharedObject(scope, "UserSO");
		log.info("Server: call sendMessage and params " + params.get(0));
		so.sendMessage("receiveMsg", params);
	}
	
	/**
	 * @category 发送私聊信息,只有被选中的人能够看到信息
	 * @param params
	 */
	public void sendPrvMessage(List<String> params) {
		if(params.size() == 3) {
			String sender = params.get(0);
			String content = params.get(1);
			String receiver = params.get(2);
			
			if(clientDic.keySet().contains(receiver)) {
				IConnection conn = clientDic.get(receiver);
				if(conn instanceof IServiceCapableConnection) {
					IServiceCapableConnection sc = (IServiceCapableConnection) conn;
					
					log.info("Server: call sendPrvMessage and sender->" + sender 
							+ " content->" + content + " receiver->" + receiver);
					
					sc.invoke("receivePrvMsg", new Object[]{sender,content});
				}
			}
		}
	}

	public Boolean appStart() {
		return true;
	}
	
	public void appStop() {
		
	}
}


相关配置文件:

1.red5-web.properties

webapp.contextPath=/chatRoom
webapp.virtualHosts=localhost, 127.0.0.1

2.red5-web.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="placeholderConfig" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
	    <property name="location" value="/WEB-INF/red5-web.properties" />
	</bean>
	
	<bean id="web.context" class="org.red5.server.Context" 
		autowire="byType" />
	
	<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" />
		<property name="handler" ref="web.handler" />
		<property name="contextPath" value="${webapp.contextPath}" />
		<property name="virtualHosts" value="${webapp.virtualHosts}" />
	</bean>

	<bean id="web.handler" 
	    class="com.red5.ChatRoom" 
		singleton="true" />

    <!-- this will support calling methods through "myhandler.<methodName>" -->
	<!-- <bean id="myhandler.service" 
	    class="the.path.to.my.ServiceHandler" 
		singleton="true" /> -->

</beans>

3.web.xml

<?xml version="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/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 
   version="2.4"> 

	<display-name>firstapp</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>
	
	<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>/chatRoom</param-value>
	</context-param>
	
    <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>

flex程序:chatRoom.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
	<mx:Script>
		<![CDATA[
			import mx.charts.chartClasses.StackedSeries;
			import mx.formatters.SwitchSymbolFormatter;
			import mx.controls.Alert;
			
			private var conn:NetConnection;
			private var so:SharedObject;
			private var rtmpURL:String = "rtmp://localhost/chatRoom";
			
			private function connHandler(evnet:Event):void {
				var loginname:String = loginName.text;
				if(loginname == "") {
					Alert.show("login name is null");
					return;
				} else {
					if(conn == null) {
						initNetConnection(loginname);
					}
				}
			}
			
			/**
			 * 初始化连接
			 */ 
			private function initNetConnection(loginname:String):void {
				conn = new NetConnection();
				conn.addEventListener(NetStatusEvent.NET_STATUS, netStatus);
				conn.connect(rtmpURL, loginname);	
			}
			
			private function netStatus(event:NetStatusEvent):void {
				if("NetConnection.Connect.Success" == event.info.code) {
					sendBtn.enabled = true;
					so = SharedObject.getRemote("UserSO", conn.uri, true);
					so.addEventListener(SyncEvent.SYNC, onSync);
					so.client = this;	//设置群聊时接收到消息的窗体
					conn.client = this;	//设置私聊时接收到消息的窗体
					so.connect(conn);
				}
			}
			
			private function onSync(event:SyncEvent):void {
				for(var i:Object in event.changeList) {
					var changeObj:Object = event.changeList[i];
					switch(changeObj.code) {
						case "success":
							break;
						case "change":
							userList.dataProvider = so.data.userlist;
							break;
					}
				}				
			}
			
			/**
			 * 失去连接
			 */ 
			private function disconnhandler(event:Event):void {
				if(conn != null && conn.connected) {
					conn.close();
					var nularr:Array = new Array();
					userList.dataProvider = nularr;
				}
			}
			
			/**
			 * 发送消息
			 */ 
			private function sendHandler(event:Event):void {
				if(conn != null && conn.connected) {
					if(IsPrivate.selected) {
						if(userList.selectedIndex == -1) {
							Alert.show("must choose a user first");
						} else {
							var pusername:String = userList.selectedItem.toString();
							if(pusername == loginName.text) {
								Alert.show("can't say privately to self");
							} else {
								//调用服务器端的私聊函数
								conn.call("sendPrvMessage", null, loginName.text, loginName.text + " says privately: " 
										+ chatWord.text, pusername);
								chatWord.text = "";
							}
						}
					} else {
						if(chatWord.text != "") {
							//调用服务器端的群聊函数
							conn.call("sendMessage", null, loginName.text + " says: " + chatWord.text);
							chatWord.text = "";
						}
					}
				}
			}
			
			/**
			 * 接收私聊信息并显示
			 */ 
			public function receivePrvMsg(sender:String, msg:String):void {
				chatArea.text += msg + "\n";
			}
			
			/**
			 * 接收群聊信息并显示
			 */ 
			public function receiveMsg(msg:String):void {
				chatArea.text += msg + "\n";
			}			
		]]>
	</mx:Script>

	<mx:Panel width="585" height="480" layout="absolute" title="ChatRoom" horizontalCenter="0" verticalCenter="0">
		<mx:Label x="46" y="26" text="Login Name:"/>
		<mx:TextInput x="125" y="24" id="loginName"/>
		<mx:Button x="314" y="24" label="Connect" id="connBtn" click="connHandler(event)"/>
		<mx:Button x="406" y="24" label="DisConnect" id="disconnBtn" click="disconnhandler(event)"/>
		<mx:TextArea x="241" y="73" width="255" height="248" id="chatArea"/>
		<mx:Label text="Chat:" horizontalCenter="-140" verticalCenter="175"/>
		<mx:TextInput x="169" y="384" width="249" id="chatWord"/>
		<mx:Button x="426" y="384" label="send" id="sendBtn" width="68" enabled="false" click="sendHandler(event)"/>
		<mx:CheckBox x="68" y="340" label="Private Chat" id="IsPrivate"/>
		<mx:TileList x="46" y="73" width="164" height="248" id="userList" columnCount="1" direction="vertical"></mx:TileList>
	</mx:Panel>
	
</mx:Application>

效果图:



分享到:
评论

相关推荐

    red5+flex实现超简易群聊天功能

    本篇文章将探讨如何利用Red5服务器和Flex技术来创建一个超简易的群聊功能。Red5是一款开源的流媒体服务器,而Flex是一种用于开发富互联网应用程序(RIA)的前端框架,基于ActionScript和Flash Player。 首先,让...

    red5+flex简单聊天例子

    【标题】:“Red5+Flex简单聊天例子”揭示了如何结合使用Red5服务器和Flex前端技术来构建一个基本的在线聊天应用。Red5是一个开源的流媒体服务器,它支持实时通信,而Flex则是一个用于创建富互联网应用程序(RIA)的...

    用red5部署的flex的简单聊天室源代码

    在本文中,我们将深入探讨如何使用Red5部署一个基于Flex的简单聊天室源代码。Red5是一款开源的流媒体服务器,而Flex是一种用于构建富互联网应用程序(RIA)的开发工具,通常与Adobe Flash Player一起使用。这个示例...

    flex 视频聊天 基于red5

    Flex是一种开源的编程框架,主要用于构建富互联网应用程序(RIA),而Red5则是一个开放源码的流媒体服务器,能够处理视频、音频流以及数据共享。 在Flex中,我们可以使用Flash Player的StageVideo API来处理视频...

    flex + red5 简单实例

    在文件名称列表中,"red5的一个小例子"可能是一个包含源代码和配置文件的项目,这个项目演示了如何用Flex客户端连接到Red5服务器并实现基本的交互。在这个例子中,你可能会看到以下关键组件: 1. Flex项目的源代码...

    基于flex 和red5的视频聊天

    本文将深入探讨如何利用Flex技术和Red5服务器来构建一个简单的视频聊天应用。Flex是Adobe公司推出的开源框架,用于创建富互联网应用程序(RIA),而Red5则是一个开放源码的流媒体服务器,支持实时流传输协议(RTMP)...

    建立red5,flex应用程序

    【建立 Red5 服务器】 ...通过上述步骤,你可以在本地搭建一个 Red5 服务器并创建一个基本的 Flex 客户端,但要实现更复杂的功能,如视频录制、播放控制等,还需要深入理解 Red5 的 API 和 Flex 的编程模型。

    RED5&Flex流媒体应用实战开发视频教程

    本教程有四大部分组成:第一部分讲项目前预备知识,在线播放器程序全程贯穿,后三个部分分别是三个项目,第一个项目是flex多人聊天室,第二个项目是在线秀场,第三个项目是视频会议,三个项目均是精心挑选和专门...

    基于flex,red5,java的一个聊天程序(含私聊)

    标题中的“基于flex,red5,java的一个聊天程序(含私聊)”指的是一个使用Adobe Flex作为前端开发工具,Red5作为流媒体服务器,以及Java作为后端编程语言构建的实时聊天应用程序,其中包括了私聊功能。这个项目可能是...

    flex-java-red5 即时聊天源码

    学习这个项目,开发者可以深入了解Flex与Java的结合,如何利用Red5实现实时数据传输,以及如何设计和实现一个简单的即时聊天系统。此外,还可以学习到如何处理并发用户、错误处理、安全性等实际开发中的问题。这对于...

    RED5&Flex流媒体应用实战开发课程1

    本教程有四大部分组成:第一部分讲项目前预备知识,在线播放器程序全程贯穿,后三个部分分别是三个项目,第一个项目是flex多人聊天室,第 二个项目是在线秀场,第三个项目是视频会议,三个项目均是精心挑选和专门...

    red5+flex 简单的hello word实例

    在本实例中,我们将使用Red5和Flex创建一个简单的“Hello World”应用。首先,你需要在本地或服务器上安装并配置Red5。这通常涉及下载Red5的发行版,解压到合适的位置,然后启动服务器。 1. **设置Red5** - 安装...

    Red5 + Flex开发实例

    Red5的第一个例子是HelloWorld,这是一个经典的基础示例,通过它开发者可以学习如何使用Red5来发布服务端程序以及如何使用Eclipse来编写客户端。编写客户端时,可以使用Flex Builder工具,该工具是Eclipse的一个插件...

    RED5&Flex流媒体应用实战开发课程2

    本教程有四大部分组成:第一部分讲项目前预备知识,在线播放器程序全程贯穿,后三个部分分别是三个项目,第一个项目是flex多人聊天室,第 二个项目是在线秀场,第三个项目是视频会议,三个项目均是精心挑选和专门...

    flex实现web聊天源码

    总的来说,这个源码实例为学习Flex和Red5的开发者提供了一个很好的起点,让他们了解如何使用Flex构建一个功能齐全的Web聊天应用,并通过Red5服务器实现客户端之间的实时通信。同时,这也是一个深入了解ActionScript...

    Flex实现的视频聊天室

    综上所述,"Flex实现的视频聊天室"是一个结合了多媒体处理、实时通信、数据管理和用户界面设计的综合项目,体现了Flex在构建互动性强、功能丰富的互联网应用上的优势。通过深入理解并运用这些技术,开发者可以创建出...

    flex java red5完全学习手册

    1. **编写服务器端代码**:使用Java编写简单的Red5服务器端逻辑,例如实现一个简单的聊天室功能。 2. **编写客户端代码**:使用Flex开发客户端界面,实现与服务器端的数据交互。 3. **运行程序**:启动Red5服务器...

    Flex视频聊天室源码

    要运行这个Flex视频聊天室,你需要一个支持RTMP的服务器,如Adobe Flash Media Server或开源的Red5。在开发和调试过程中,你可以使用Flex Builder或IntelliJ IDEA等IDE,它们提供了集成的Flex开发环境和调试工具。 ...

    red5流媒体服务器一个正常的demo

    通过RTMP协议,Red5可以与Adobe Flash Player或Flex应用程序无缝协作,实现视频播放和交互。 这个demo包含的文件很可能是以下组成部分: 1. **应用配置**:可能包含服务器的应用配置文件,比如`application.xml`,...

Global site tag (gtag.js) - Google Analytics