51CTO下载Flex+Red5语音视频聊天程序实现.docx
《51CTO下载Flex+Red5语音视频聊天程序实现.docx》由会员分享,可在线阅读,更多相关《51CTO下载Flex+Red5语音视频聊天程序实现.docx(9页珍藏版)》请在冰豆网上搜索。
51CTO下载Flex+Red5语音视频聊天程序实现
Flex+Red5语音视频聊天程序实现
2010-12-0609:
30:
32| 分类:
程序代码| 标签:
red5 |字号大中小 订阅
java代码部分
packagefirst;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.Set;
importorg.red5.server.adapter.ApplicationAdapter;
importorg.red5.server.api.IConnection;
importorg.red5.server.api.IScope;
importorg.red5.server.api.Red5;
importorg.red5.server.api.service.IServiceCapableConnection;
importorg.red5.server.api.so.ISharedObject;
publicclassApplicationextendsApplicationAdapter{
//属性
privateIScopeappScope;
privateStringuserName;
//共享存储在线用户
privateISharedObjectlistSO;
privateMaponlineList=newHashMap();//在线用户表
//程序运行时志向
publicbooleanappStart(IScopeapp){
if(!
super.appStart(app)){
returnfalse;
}
appScope=app;
returntrue;
}
@Override
publicbooleanappConnect(IConnectionarg0,Object[]arg1){
/**
* 用户首次连接server时触发,检查用户是否重复登录,将用户添加到在线用户表中
*/
StringuserId=arg0.getClient().getId();
if(!
super.appConnect(arg0,arg1)){
returnfalse;
}
if(arg1!
=null){
userName=(String)arg1[0];
}
if(onlineList.get(userName)!
=null){
rejectClient("请不要重复登录");
returnfalse;
}
onlineList.put(userName,arg0);
listSO=getSharedObject(appScope,"listSO",false);
listSO.setAttribute(userId,userName);
System.out.println("Theuser:
"+userName+","+userName+"loginedsuccessfully");
returntrue;
}
/**
*通知所有人当前用户登录
*@paramparams
*/
publicvoidgetOnloadUser(Object[]params){
StringclientName=params[0].toString();
if(null==clientName||"".equals(clientName)){
return;
}
//给所有客户端数据
IScopescope=Red5.getConnectionLocal().getScope();
Iteratorit=scope.getConnections().iterator();
for(;it.hasNext();){
Setconnections=(Set)it.next();
IConnectiontempConn=(IConnection)connections.iterator().next();
if(tempConninstanceofIServiceCapableConnection){
IServiceCapableConnectionsc=(IServiceCapableConnection)tempConn;
sc.invoke("result_getOnloadUser",newObject[]{clientName});
}
}
}
//聊天
publicvoidsayToAll(Object[]params){
IConnectionconn=Red5.getConnectionLocal();
Stringuser_id=conn.getClient().getId();
StringclientName=(String)listSO.getAttribute(user_id);
System.out.println("************发言者是:
"+clientName);
StringsayToName=params[0]==null?
"":
params[0].toString().trim();
StringsayWhat=params[1]==null?
"":
params[1].toString().trim();
if("".equals(sayToName)||"All".equals(sayToName))//发消息给聊天室的所有人.
{
IScopescope=Red5.getConnectionLocal().getScope();
Iteratorit=scope.getConnections().iterator();
for(;it.hasNext();){
Setconnections=(Set)it.next();
IConnectiontempConn=(IConnection)connections.iterator().next();
if(tempConninstanceofIServiceCapableConnection){
IServiceCapableConnectionsc=(IServiceCapableConnection)tempConn;
//调用客户端showMessage方法。
sc.invoke("showMessage",newObject[]{clientName+"toAll:
"+sayWhat});
}
}
}else{
IConnectiontempConn=onlineList.get(sayToName);
if(tempConninstanceofIServiceCapableConnection){
IServiceCapableConnectionsc=(IServiceCapableConnection)tempConn;
sc.invoke("showMessage",newObject[]{clientName+"to"+sayToName+":
"+sayWhat});
}
IServiceCapableConnectionsc=(IServiceCapableConnection)conn;
sc.invoke("showMessage",newObject[]{clientName+"to"+sayToName+":
"+sayWhat});
}
}
//用户断开连接的时候触发
publicvoidappDisconnect(IConnectionconn){
Stringdis_user_id=conn.getClient().getId();
Stringuser=(String)listSO.getAttribute(dis_user_id);
//根据ID删除对应在线纪录
onlineList.remove(user);
//删除用户列表共享对象的对应属性
listSO.removeAttribute(dis_user_id);
IScopescope=Red5.getConnectionLocal().getScope();
Iteratorit=scope.getConnections().iterator();
for(;it.hasNext();){
Setconnections=(Set)it.next();
IConnectiontempConn=(IConnection)connections.iterator().next();
if(tempConninstanceofIServiceCapableConnection){
IServiceCapableConnectionsc=(IServiceCapableConnection)tempConn;
//服务器端调用客户端flash方法。
sc.invoke("disconnectMessage",newObject[]{user});
}
}
}
//视频邀请
publicvoidvideoInvite(Object[]params){
IConnectionconn=Red5.getConnectionLocal();
Stringuser_id=conn.getClient().getId();
StringclientName=(String)listSO.getAttribute(user_id);
System.out.println("************视频邀请者是:
"+clientName);
StringsayToName=params[0]==null?
"":
params[0].toString().trim();
if("".equals(sayToName)||"All".equals(sayToName))//发消息给聊天室的所有人.
{
System.out.println("不可以邀请0或者多个人");
}else{
IConnectiontempConn=onlineList.get(sayToName);
if(tempConninstanceofIServiceCapableConnection){
IServiceCapableConnectionsc=(IServiceCapableConnection)tempConn;
sc.invoke("showInviteMessage",newObject[]{clientName+";"+sayToName});
}
}
}
//同意邀请后调用邀请方方法
publicvoidagreeVideoInvite(Object[]params){
IConnectionconn=Red5.getConnectionLocal();
System.out.println("<<<< //邀请者
StringinviteUserName=params[0]==null?
"":
params[0].toString().trim();
//被邀请者
StringotherUserName=params[1]==null?
"":
params[1].toString().trim();
System.out.println("***邀请者是:
"+inviteUserName);
System.out.println("***被邀请者是:
"+otherUserName);
if("".equals(inviteUserName))//发消息给聊天室的所有人.
{
System.out.println("出错了");
}else{
System.out.println("*********调用成功");
IConnectiontempConn=onlineList.get(inviteUserName);
if(tempConninstanceofIServiceCapableConnection){
IServiceCapableConnectionsc=(IServiceCapableConnection)tempConn;
sc.invoke("showVideo",newObject[]{otherUserName});
System.out.println("*********调用结束");
}
}
}
}
Flex3代码部分
xmlversion="1.0"encoding="utf-8"?
>
WindowedApplicationxmlns:
mx="layout="absolute">
Script>
[CDATA[
importmx.events.CloseEvent;
importmx.collections.ArrayCollection;
importmx.controls.Alert;
privatevarlistSO:
SharedObject;
privatevaruserArr:
Array;
privatevarconn:
NetConnection;
privatevarlocalUsername:
String;
privatevarstm:
NetStream;
privatevarstm2:
NetStream;
//摄像头
privatevarcam:
Camera;
//麦克风
privatevarmic:
Microphone;
privatevarvideo_0:
Video;
privatevarvideo_1:
Video;
[Bindable]
publicvarcards:
ArrayCollection;
//视频邀请集合
publicvarvideoUsers:
Array;
protectedfunctionlogin(event:
MouseEvent):
void
{
//TODOAuto-generatedmethodstub
localUsername=txt_name.text;
if(localUsername==""){
Alert.show("用户名不能为空");
return;
}else{
if(conn==null){
conn=newNetConnection();
conn.client=this;
conn.addEventListener(NetStatusEvent.NET_STATUS,_statusHandler);
conn.connect("rtmp:
//192.168.0.10/szftest",localUsername);
}
}
}
//状态监听
privatefunction_statusHandler(evt:
NetStatusEvent):
void{
if(evt.info.code=="NetConnection.Connect.Success"){
this.currentState="chat";
Alert.show("连接成功");
_setListSO(); //创建用户列表共享对象
this.showJoinInInfo(localUsername);
}
if(evt.info.code=="NetConnection.Connect.Failed"){
Alert.show("连接失败");
}
if(evt.info.code=="NetConnection.Connect.Closed"){
Alert.show("连接关闭");
}
}
publicfunctionshowJoinInInfo(message:
String):
void
{
//conn.call("getOnloadUser",newResponder(result_getUsers);
conn.call("getOnloadUser",null,message);
}
publicfunctionresult_getOnloadUser(str:
String):
void{
txt_chatmsg.text+=str+"加入聊天室"+"\n";
}
//创建用户列表共享对象
privatefunction_setListSO():
void{
listSO=SharedObject.getRemote("listSO",conn.uri,false);
listSO.connect(conn);
listSO.addEventListener(SyncEvent.SYNC,_listSOSyncHandler);
}
//用户列表共享对象被更新之后事件
privatefunction_listSOSyncHandler(evt:
SyncEvent):
void{
_showUserList(); //更新用户列表
}
//更新用户列表
privatefunction_showUserList():
void{
cards=newArrayCollection(
[{label:
"All"}]
);
userArr=newArray();
//用户数组更新
for(vartmp:
StringinlistSO.data){
userArr.push(listSO.data[tmp]);
}
//添加ArrayCollection
for(vari:
int=0;i cards.addItem({label:
userArr[i]});
}
//将数组添加到列表中显示出来
userList.dataProvider=cards;
users.dataProvider=cards;
}
publicfunctionshowMessage(message:
String):
void
{
txt_chatmsg.text+=message+"\n";
}
protectedfunctionsendMessage(event:
MouseEvent):
void
{
//TODOAuto-generatedmethodstub
varsendString:
String=txt_yousay.text;
//varsendTo:
String=users.selectedItem.userName==null?
"":
users.selectedItem.userId;
varsendTo:
String=userList.selectedItem.label;
txt_yousay.text="";
conn.call("sayToAll",null,sendTo,sendString);
}
//断线通知
publicfunctiondisconnectMessage(disUser:
String):
void{
txt_chatmsg.text+=disUser+"退出聊天室\n";
}
//视频邀请
protectedfunctionvideo_clickHandler(event:
MouseEvent):
void
{
//TODOAuto-generatedmethodstub
varsendTo:
String=userList.selectedItem.label;
conn.call("videoInvite",null,sendTo);
}
//显示自己的视频
publicfunction_publishVideo():
void{
stm=newN