- 浏览: 74643 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
592386141:
有没得具体配置呢 有的话发592386141@qq.c ...
负载均衡 -
woyaowenzi:
这玩意生成出来的XML不怎么好看啊。解析也费劲。
根据对象生成XML文档 -
jidifeiyan:
忽然要开发个语音视频聊天工具,毫无头绪,学习下
FMS案例开发--视频聊天室(一)【转】 -
tongw4266:
感谢楼主的精彩分析,这个问题我也困扰了很久。我想问问的事像ha ...
集群和数据库负载均衡的研究
通过前面的简单分析,下面正式进入视频聊天室的设计开发阶段。根据我以前开发管理软件的经验,我们从基础模块开始,首先设计和开发后台功能模块,实现基本的用户注册和通信接口等相关功能。
聊天室需求简单,主要就一张表用来存储用户注册资料,当用户登陆聊天室的时候,则通过通信接口来验证用户。SQL脚本如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->USE [ChatRoom]
GO
/****** 对象: Table [dbo].[UserInfo] 脚本日期: 05/16/2009 16:45:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[UserInfo](
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserName] [varchar](50) NULL,
[NickName] [varchar](50) NOT NULL,
[Password] [varchar](50) NOT NULL,
[QQ] [varchar](20) NULL,
[RegTime] [datetime] NULL,
CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
GO
/****** 对象: Table [dbo].[UserInfo] 脚本日期: 05/16/2009 16:45:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[UserInfo](
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserName] [varchar](50) NULL,
[NickName] [varchar](50) NOT NULL,
[Password] [varchar](50) NOT NULL,
[QQ] [varchar](20) NULL,
[RegTime] [datetime] NULL,
CONSTRAINT [PK_UserInfo] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
本案例开发的通信接口采用WebService提供,考虑到只是做一些基本的通信加上本文重在于演示,所以就不去使用使用诸如FluorineFx之类的通信网关了。如有对FluorineFx感兴趣的朋友可以浏览以下文章:《Flex与.NET互操作系列文章》
数据访问通过Linq To Sql实现,对外提供WebService接口,Flex通过WebService和.NET通信达到数据交互的目的。
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->namespace ChatRoomService
{
/// <summary>
/// CRService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class CRService : System.Web.Services.WebService
{
private static ChatRoomDataContext ctx = new ChatRoomDataContext();
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
/// <summary>
/// 用户登录
/// </summary>
/// <param name="UserName"></param>
/// <param name="Password"></param>
/// <returns></returns>
[WebMethod]
public UserInfo Login(string UserName, string Password)
{
List<UserInfo> list= ctx.UserInfo.Where(u => u.UserName == UserName).Where(p => p.Password == Password).ToList();
if (list.Count>0)
return list[0];
return null;
}
/// <summary>
/// 用户注册
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[WebMethod]
public string Register(string infos)
{
string[] info = infos.Split('|');
UserInfo userInfo = new UserInfo
{
UserName = info[0],
Password = info[1],
NickName = info[2],
QQ = info[3],
RegTime = DateTime.Now
};
List<UserInfo> list = ctx.UserInfo.Where(n => n.UserName == userInfo.UserName).ToList();
if (list.Count > 0)
return string.Format("{0}|{1}", "Error", "用户" + userInfo.UserName + "已经存在");
try
{
ctx.UserInfo.InsertOnSubmit(userInfo);
ctx.SubmitChanges();
return "Success";
}
catch
{
return "Error";
}
}
}
}
{
/// <summary>
/// CRService 的摘要说明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class CRService : System.Web.Services.WebService
{
private static ChatRoomDataContext ctx = new ChatRoomDataContext();
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
/// <summary>
/// 用户登录
/// </summary>
/// <param name="UserName"></param>
/// <param name="Password"></param>
/// <returns></returns>
[WebMethod]
public UserInfo Login(string UserName, string Password)
{
List<UserInfo> list= ctx.UserInfo.Where(u => u.UserName == UserName).Where(p => p.Password == Password).ToList();
if (list.Count>0)
return list[0];
return null;
}
/// <summary>
/// 用户注册
/// </summary>
/// <param name="info"></param>
/// <returns></returns>
[WebMethod]
public string Register(string infos)
{
string[] info = infos.Split('|');
UserInfo userInfo = new UserInfo
{
UserName = info[0],
Password = info[1],
NickName = info[2],
QQ = info[3],
RegTime = DateTime.Now
};
List<UserInfo> list = ctx.UserInfo.Where(n => n.UserName == userInfo.UserName).ToList();
if (list.Count > 0)
return string.Format("{0}|{1}", "Error", "用户" + userInfo.UserName + "已经存在");
try
{
ctx.UserInfo.InsertOnSubmit(userInfo);
ctx.SubmitChanges();
return "Success";
}
catch
{
return "Error";
}
}
}
}
由于是直接使用WebService通信,ActionScript对象和C#对象之间的序列化问题,上面就直接以字符传的形式返回。有了通信接口,下面就可以做用户注册和登录的工作了。在Flex客户端全部通过<mx:WebService>组件和WebService通信,注册的完整代码如下:
Flex注册界面完整代码
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
width="400" height="282" showCloseButton="true"
close="closeWindow(event)" fontSize="12">
<mx:WebService id="ctService" wsdl="http://localhost:1535/CRService.asmx?wsdl">
<mx:operation name="Register" result="onRegisterResult(event)" fault="onRegisterFaile(event)">
</mx:operation>
</mx:WebService>
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import flex.chatroom.vo.UserInfo;
import mx.rpc.events.ResultEvent;
import mx.managers.PopUpManager;
private function onRegister(evt:MouseEvent):void
{
var info:UserInfo = new UserInfo();
info.UserName = this.txtUserName.text;
info.Password = this.txtPassword.text;
info.NickName = this.txtNickName.text;
info.QQ = this.txtQQ.text;
var infos:String=info.UserName+"|"+info.Password+"|"+info.NickName+"|"+info.QQ;
this.ctService.Register(infos);
}
private function onRegisterResult(evt:ResultEvent):void
{
var result:String = evt.result.toString();
var arr:Array = result.split('|');
if(arr.length>1)
{
Alert.okLabel="确 定";
Alert.show(arr[1],"系统提示");
}
if(arr[0]=="Success")
{
Alert.okLabel="确 定";
Alert.show("恭喜你,注册成功!","系统提示");
}
else
{
Alert.okLabel="确 定";
Alert.show("注册失败,请重试!","系统提示");
}
}
private function onRegisterFaile(evt:Event):void
{
Alert.okLabel="确 定";
Alert.show("注册失败,请重试!","系统提示");
}
private function closeWindow(evt:Event):void
{
PopUpManager.removePopUp(this);
}
]]>
</mx:Script>
<mx:Form y="2" x="2" width="99%">
<mx:FormHeading label="新用户注册"/>
<mx:FormItem label="用户名:">
<mx:TextInput id="txtUserName" />
</mx:FormItem>
<mx:FormItem label="密 码:">
<mx:TextInput id="txtPassword" />
</mx:FormItem>
<mx:FormItem label="呢 称:">
<mx:TextInput id="txtNickName" />
</mx:FormItem>
<mx:FormItem label="Q Q:">
<mx:TextInput id="txtQQ" />
</mx:FormItem>
<mx:FormItem>
<mx:HBox>
<mx:Button label="注 册" click="onRegister(event)" fontWeight="normal" width="95"/>
<mx:Button label="取 消" click="closeWindow(event)" fontWeight="normal"/>
</mx:HBox>
</mx:FormItem>
</mx:Form>
</mx:TitleWindow>
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
width="400" height="282" showCloseButton="true"
close="closeWindow(event)" fontSize="12">
<mx:WebService id="ctService" wsdl="http://localhost:1535/CRService.asmx?wsdl">
<mx:operation name="Register" result="onRegisterResult(event)" fault="onRegisterFaile(event)">
</mx:operation>
</mx:WebService>
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import flex.chatroom.vo.UserInfo;
import mx.rpc.events.ResultEvent;
import mx.managers.PopUpManager;
private function onRegister(evt:MouseEvent):void
{
var info:UserInfo = new UserInfo();
info.UserName = this.txtUserName.text;
info.Password = this.txtPassword.text;
info.NickName = this.txtNickName.text;
info.QQ = this.txtQQ.text;
var infos:String=info.UserName+"|"+info.Password+"|"+info.NickName+"|"+info.QQ;
this.ctService.Register(infos);
}
private function onRegisterResult(evt:ResultEvent):void
{
var result:String = evt.result.toString();
var arr:Array = result.split('|');
if(arr.length>1)
{
Alert.okLabel="确 定";
Alert.show(arr[1],"系统提示");
}
if(arr[0]=="Success")
{
Alert.okLabel="确 定";
Alert.show("恭喜你,注册成功!","系统提示");
}
else
{
Alert.okLabel="确 定";
Alert.show("注册失败,请重试!","系统提示");
}
}
private function onRegisterFaile(evt:Event):void
{
Alert.okLabel="确 定";
Alert.show("注册失败,请重试!","系统提示");
}
private function closeWindow(evt:Event):void
{
PopUpManager.removePopUp(this);
}
]]>
</mx:Script>
<mx:Form y="2" x="2" width="99%">
<mx:FormHeading label="新用户注册"/>
<mx:FormItem label="用户名:">
<mx:TextInput id="txtUserName" />
</mx:FormItem>
<mx:FormItem label="密 码:">
<mx:TextInput id="txtPassword" />
</mx:FormItem>
<mx:FormItem label="呢 称:">
<mx:TextInput id="txtNickName" />
</mx:FormItem>
<mx:FormItem label="Q Q:">
<mx:TextInput id="txtQQ" />
</mx:FormItem>
<mx:FormItem>
<mx:HBox>
<mx:Button label="注 册" click="onRegister(event)" fontWeight="normal" width="95"/>
<mx:Button label="取 消" click="closeWindow(event)" fontWeight="normal"/>
</mx:HBox>
</mx:FormItem>
</mx:Form>
</mx:TitleWindow>
用户登录同样是使用WebService通信进行数据库验证,实现代码大致如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><mx:WebService id="ctService" wsdl="http://localhost:1535/CRService.asmx?wsdl">
<mx:operation name="Login" result="onLoginRusult(event)" fault="onLoginFaile(event)">
</mx:operation>
</mx:WebService>
private function onLogin():void
{
this.ctService.Login(this.txtUserName.text,this.txtPassword.text);
}
private function onLoginRusult(evt:ResultEvent):void
{
if(evt.result != null)
{
//显示自己的视频
//displayCameraSelf();
//连接FMS服务器发布自己的视频流
publishNc = new NetConnection();
publishNc.connect("rtmp://localhost/ChatRoom");
so = SharedObject.getRemote("ChatSO",publishNc.uri,false);
publishNc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
so.addEventListener(SyncEvent.SYNC,onSyncHandler);
so.connect(publishNc);
myUserName = evt.result.UserName;
myNickName = evt.result.NickName;
this.loginPanel.visible = false;
this.chatRoomPanel.visible=true;
ChatRoomViewStack.selectedChild = chatRoomPanel;
}
else
{
Alert.okLabel="确 定";
Alert.show("登录失败!","系统提示");
}
}
<mx:operation name="Login" result="onLoginRusult(event)" fault="onLoginFaile(event)">
</mx:operation>
</mx:WebService>
private function onLogin():void
{
this.ctService.Login(this.txtUserName.text,this.txtPassword.text);
}
private function onLoginRusult(evt:ResultEvent):void
{
if(evt.result != null)
{
//显示自己的视频
//displayCameraSelf();
//连接FMS服务器发布自己的视频流
publishNc = new NetConnection();
publishNc.connect("rtmp://localhost/ChatRoom");
so = SharedObject.getRemote("ChatSO",publishNc.uri,false);
publishNc.addEventListener(NetStatusEvent.NET_STATUS,onNetStatusHandler);
so.addEventListener(SyncEvent.SYNC,onSyncHandler);
so.connect(publishNc);
myUserName = evt.result.UserName;
myNickName = evt.result.NickName;
this.loginPanel.visible = false;
this.chatRoomPanel.visible=true;
ChatRoomViewStack.selectedChild = chatRoomPanel;
}
else
{
Alert.okLabel="确 定";
Alert.show("登录失败!","系统提示");
}
}
通信主要就这两个功能点,都比较简单,关于Flex与WebServie通信我以前也写过两篇文章在《Flex与.NET互操作系列文章》里,不熟悉的的朋友可以先看看通信方面的实现。
本文就先介绍到这里,下一篇将介绍聊天室的详细开发,包括视频、语音、文字聊天的实现等相关知识点。
发表评论
-
FMS案例开发--视频聊天室(三)【转】
2010-12-25 17:35 1310本文要介绍的 ... -
FMS案例开发--视频聊天室(一)【转】
2010-12-25 17:33 2157FMS3系列文章已 ... -
FMS3系列(七):FMS案例开发--视频聊天室【转】
2010-12-25 17:32 1121FMS3系列文章已经写到第7篇了,本系列文章重在抛砖引玉,只是 ... -
FMS3系列(六):使用远程共享对象(SharedObject)实现多人时时在线聊天(Flex | Flash)
2010-12-25 17:29 1253FMS开发中,经常会使用共享对象来同步用户和存储数据。对于实现 ... -
FMS3系列(五):通过FMS实现时时视频聊天(Flash|Flex)【转】
2010-12-25 17:27 1068本系列的前几篇文章中分别介绍了,连接FMS服务器、建立播放程序 ... -
FMS3系列(四):在线视频录制、视频回放【转】
2010-12-25 17:27 982使用Flash/Flex+FMS实现在线视频录制、视频回放的很 ... -
FMS3系列(三):创建基于FMS的流媒体播放程序,看山寨帮的山寨传奇【转】
2010-12-25 17:24 896本文主要介绍怎么去创建基于FMS的流媒体播放程序,Flash客 ... -
FMS3系列(二):创建可交互的FMS连接--I can say:Hello World【转】
2010-12-25 17:19 1005在做FMS开发中,flash客户端与FMS服务器通信交互数据等 ... -
FMS3系列(一):第一个FMS程序,连接到FMS服务器(Flash/Flex两种实现)[转]
2010-12-25 17:16 798FMS是个很牛X的东西,到底有多牛X我不想在这里多说 ...
相关推荐
5. **FMS聊天室应用案例** - **在线教育**:实时的课堂互动,教师与学生间的音视频交流。 - **企业协作**:远程会议、团队讨论,提高工作效率。 - **娱乐直播**:游戏直播、音乐会、体育赛事等,观众与主播互动。...
在本案例中,我们主要探讨的是如何利用Adobe的FMS(Flash Media Server)技术来开发一个视频聊天室。FMS是Adobe提供的一款强大的流媒体服务器,它支持实时的音频、视频传输,以及数据共享,非常适合用于构建交互性强...
在本FMS案例开发中,我们探讨了一个基于Adobe Flash Media Server 3 (FMS)的视频聊天室的构建过程。这个项目旨在满足日益增长的实时交互式互联网应用需求,特别是那些涉及视频通信的场景,如视频聊天、视频会议和...
【标题】"AS3 + FMS3聊天室"是一个基于ActionScript 3(AS3)编程语言和Flash Media Server 3(FMS3)技术构建的在线聊天室应用。这个项目提供了一个简单但实用的平台,让多个用户可以实时交流分享信息。 【描述】...
3. **源码**:完整的聊天室应用源码,可能用到了实时通信技术,如WebSocket,用于FMS系统的远程监控和交互。 资料部分可能涵盖: 1. **教程**:详细的教学材料,引导读者从基础到进阶地学习FMS编程。 2. **案例研究...
5. 5.doc - 实例解析,通过实际案例学习如何使用FMS3开发应用。 6. 6.doc - 高级话题,探讨更复杂的技术实现和优化技巧。 7. 7.doc - 常见问题与解决方案,解决学习和使用过程中遇到的问题。 通过这个详细的教程,...
4. **互动性**: FMS3支持实时交互功能,如聊天室、投票、游戏等,增强了用户参与度和沉浸感。 5. **可扩展性**: 开放的API接口使得开发者可以自定义功能,实现更复杂的应用场景,如数据分析、用户行为跟踪等。 6. ...
在本案例中,我们讨论的是ActiveMQ的5.1.0版本,这在当时是一个较新的版本,特别适合于Flex应用程序中的即时消息传递需求,如构建聊天室等功能。 Java消息服务(JMS)是Java平台上的一个标准API,用于在分布式环境...
#### 三、实践案例 —— 聊天室 接下来,我们将通过构建一个简单的聊天室应用来实际演示如何使用 FMS。 1. **准备环境**: 确保 FMS 已正确安装并配置好。 2. **创建项目**: 在 `applications` 目录下新建项目...
1. **编写服务器端代码**:使用Java编写简单的Red5服务器端逻辑,例如实现一个简单的聊天室功能。 2. **编写客户端代码**:使用Flex开发客户端界面,实现与服务器端的数据交互。 3. **运行程序**:启动Red5服务器...
6. **视频聊天室实现**:视频聊天室需要处理多用户间的视频流同步、带宽管理、音视频编码解码等问题,对服务器性能和网络条件有较高要求。 7. **客户端与服务器通信**:使用Flex和FMS,客户端和服务器之间的通信可能...