- 浏览: 3559 次
文章分类
最新评论
用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是一种用于开发富互联网应用程序(RIA)的前端框架,基于ActionScript和Flash Player。 首先,让...
【标题】:“Red5+Flex简单聊天例子”揭示了如何结合使用Red5服务器和Flex前端技术来构建一个基本的在线聊天应用。Red5是一个开源的流媒体服务器,它支持实时通信,而Flex则是一个用于创建富互联网应用程序(RIA)的...
在本文中,我们将深入探讨如何使用Red5部署一个基于Flex的简单聊天室源代码。Red5是一款开源的流媒体服务器,而Flex是一种用于构建富互联网应用程序(RIA)的开发工具,通常与Adobe Flash Player一起使用。这个示例...
Flex是一种开源的编程框架,主要用于构建富互联网应用程序(RIA),而Red5则是一个开放源码的流媒体服务器,能够处理视频、音频流以及数据共享。 在Flex中,我们可以使用Flash Player的StageVideo API来处理视频...
在文件名称列表中,"red5的一个小例子"可能是一个包含源代码和配置文件的项目,这个项目演示了如何用Flex客户端连接到Red5服务器并实现基本的交互。在这个例子中,你可能会看到以下关键组件: 1. Flex项目的源代码...
本文将深入探讨如何利用Flex技术和Red5服务器来构建一个简单的视频聊天应用。Flex是Adobe公司推出的开源框架,用于创建富互联网应用程序(RIA),而Red5则是一个开放源码的流媒体服务器,支持实时流传输协议(RTMP)...
【建立 Red5 服务器】 ...通过上述步骤,你可以在本地搭建一个 Red5 服务器并创建一个基本的 Flex 客户端,但要实现更复杂的功能,如视频录制、播放控制等,还需要深入理解 Red5 的 API 和 Flex 的编程模型。
本教程有四大部分组成:第一部分讲项目前预备知识,在线播放器程序全程贯穿,后三个部分分别是三个项目,第一个项目是flex多人聊天室,第二个项目是在线秀场,第三个项目是视频会议,三个项目均是精心挑选和专门...
标题中的“基于flex,red5,java的一个聊天程序(含私聊)”指的是一个使用Adobe Flex作为前端开发工具,Red5作为流媒体服务器,以及Java作为后端编程语言构建的实时聊天应用程序,其中包括了私聊功能。这个项目可能是...
学习这个项目,开发者可以深入了解Flex与Java的结合,如何利用Red5实现实时数据传输,以及如何设计和实现一个简单的即时聊天系统。此外,还可以学习到如何处理并发用户、错误处理、安全性等实际开发中的问题。这对于...
本教程有四大部分组成:第一部分讲项目前预备知识,在线播放器程序全程贯穿,后三个部分分别是三个项目,第一个项目是flex多人聊天室,第 二个项目是在线秀场,第三个项目是视频会议,三个项目均是精心挑选和专门...
在本实例中,我们将使用Red5和Flex创建一个简单的“Hello World”应用。首先,你需要在本地或服务器上安装并配置Red5。这通常涉及下载Red5的发行版,解压到合适的位置,然后启动服务器。 1. **设置Red5** - 安装...
Red5的第一个例子是HelloWorld,这是一个经典的基础示例,通过它开发者可以学习如何使用Red5来发布服务端程序以及如何使用Eclipse来编写客户端。编写客户端时,可以使用Flex Builder工具,该工具是Eclipse的一个插件...
本教程有四大部分组成:第一部分讲项目前预备知识,在线播放器程序全程贯穿,后三个部分分别是三个项目,第一个项目是flex多人聊天室,第 二个项目是在线秀场,第三个项目是视频会议,三个项目均是精心挑选和专门...
总的来说,这个源码实例为学习Flex和Red5的开发者提供了一个很好的起点,让他们了解如何使用Flex构建一个功能齐全的Web聊天应用,并通过Red5服务器实现客户端之间的实时通信。同时,这也是一个深入了解ActionScript...
综上所述,"Flex实现的视频聊天室"是一个结合了多媒体处理、实时通信、数据管理和用户界面设计的综合项目,体现了Flex在构建互动性强、功能丰富的互联网应用上的优势。通过深入理解并运用这些技术,开发者可以创建出...
1. **编写服务器端代码**:使用Java编写简单的Red5服务器端逻辑,例如实现一个简单的聊天室功能。 2. **编写客户端代码**:使用Flex开发客户端界面,实现与服务器端的数据交互。 3. **运行程序**:启动Red5服务器...
要运行这个Flex视频聊天室,你需要一个支持RTMP的服务器,如Adobe Flash Media Server或开源的Red5。在开发和调试过程中,你可以使用Flex Builder或IntelliJ IDEA等IDE,它们提供了集成的Flex开发环境和调试工具。 ...
通过RTMP协议,Red5可以与Adobe Flash Player或Flex应用程序无缝协作,实现视频播放和交互。 这个demo包含的文件很可能是以下组成部分: 1. **应用配置**:可能包含服务器的应用配置文件,比如`application.xml`,...