package wm;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IClient;
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;
import wm.vo.UserVO;
/**
*
* @author luqinglong@wanmei.com
*
*/
public class ScopeTest extends ApplicationAdapter {
protected static Log log = LogFactory.getLog(ScopeTest.class.getName());
/**
* 房间用户列表
* String : 房间名称
* List :该房间的用户
*/
private HashMap<String ,List<UserVO>> users = new HashMap <String , List<UserVO>> () ;
/**
* 客户端列表
*/
private List <IConnection> clientConnList = new ArrayList<IConnection> () ;
/**
* 同步
*/
private ISharedObject shareObj ;
public boolean appStart(IScope arg0) {
System.out.println(" 启动appStart");
for (int i=0 ; i< 10 ; i++ ) {
users.put("room"+i, new ArrayList<UserVO>()) ;
System.out.println ("创建房间: room"+i) ;
}
return super.appStart(arg0);
}
/**
* 取得每个房间的人数
*/
public String roomsInfo () {
StringBuffer rooms = new StringBuffer() ;
rooms.append("<root>") ;
for (int i=0 ; i<users.size() ; i++) {
rooms.append("<room>")
.append("<id>").append("room"+i).append("</id>")
.append("<num>").append(users.get("room"+i).size()).append("</num>")
.append("</room>");
}
rooms.append("</root>") ;
clientConnList.add(Red5.getConnectionLocal()) ;
return rooms.toString() ;
}
/**
* 与服务端建立连接
*/
public boolean connect(IConnection conn, IScope scope, Object[] params) {
System.out.println("与服务端建立连接...................作用域名称为:"+scope.getName());
return super.connect(conn, scope, params) ;
}
/**
* 与客户端断开连接
*/
public void disconnect(IConnection conn, IScope scope) {
System.out.println("与客户端断开连接....................");
clientConnList.remove(conn) ;
}
/**
* 房间第一次启动
*/
public boolean roomStart(IScope scope) {
System.out.println("初始化房间:"+scope.getName());
//创建sharedObject
this.createSharedObject(scope, scope.getName(), true ) ;
shareObj = this.getSharedObject(scope, scope.getName(),true) ;
shareObj.addSharedObjectListener(new ChatSharedObjectListener()) ;
return super.roomStart(scope);
}
/**
* 用户进入房间
*/
public boolean roomConnect(IConnection con, Object[] arg1) {
IScope scope = con.getScope();
String userName =(String) arg1[0] ;
String roomId = scope.getName() ;
System.out.println ("用户名:"+userName) ;
List<UserVO> users = this.users.get(roomId) ;
/*
* 每个房间最多3个人
*/
if(users.size() >= 3){
System.out.println("房间人数已满 .......................");
return false ;
}
/*
* 设置用户信息。包括用户名、对应的连接 、所在的房间id
*/
UserVO user = new UserVO () ;
user.setUserName(userName) ;
user.setConn(con) ;
user.setRoomId(roomId) ;
updateCurrentRoomClients( user ) ;
/*
* 把用户加入房间
*/
users.add(user) ;
con.getClient().setAttribute("userName", userName) ;
updateRoomsNum (roomId,"add") ;
/**
* 通知该房间其他用户
*/
return super.roomConnect(con, arg1);
}
/**
* 通知当前房间其他用户,有新用户上线
*/
public void updateCurrentRoomClients (UserVO user) {
/*
* 得到改房间所有用户
*/
List<UserVO> userList = this.users.get(user.getRoomId()) ;
StringBuffer userXml = new StringBuffer () ;
userXml.append("<root>")
.append("<user>")
.append("<name>"+user.getUserName()+"</name>")
.append("<id>"+user.getId()+"</id>")
.append("</user>")
.append("</root>") ;
for (int i=0 ; i< userList.size() ; i++) {
IConnection conn = userList.get(i).getConn() ;
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("addNewUser_byCall", new Object[]{userXml.toString()});
}
}
/**
* 更新所有房间的人数显示
* @param roomId :房间ID
* @param falg add为: 增加用户 del:为删除
*/
public void updateRoomsNum (String roomId,String flag) {
List <IConnection> conns= this.clientConnList ;
for (int i = 0 ; i< conns.size() ; i++){
IConnection conn = conns.get(i) ;
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("updateRoomsNum_byCall", new Object[]{roomId,flag});
}
}
/**
* 取得该房间的在线用户
* @return string as xml
*/
public String users(String roomId) {
List<UserVO> users = this.users.get(roomId) ;
StringBuffer userXml = new StringBuffer () ;
userXml.append("<root>");
for (int i=0 ; i< users.size() ; i++) {
userXml.append("<user>")
.append("<name>"+users.get(i).getUserName()+"</name>")
.append("<id>"+users.get(i).getId()+"</id>")
.append("</user>");
}
userXml.append("</root>");
return userXml.toString() ;
}
/**
* 用户离开房间
*/
public void roomLeave (IClient client, IScope s) {
String userName = client.getAttribute("userName").toString() ;
String roomId = s.getName() ;
System.out.println("用户离开......................."+userName +" size:1+"+users.get(roomId).size());
/*
* 从用户列表中删除该用户
*/
UserVO u = new UserVO () ;
u.setUserName(userName) ;
users.get(roomId).remove(u) ;
System.out.println("size 2 : "+users.get(roomId).size());
/*
* 得到改房间所有用户
*/
List<UserVO> userList = this.users.get(roomId) ;
for (int i=0 ; i< userList.size() ; i++) {
IConnection conn = userList.get(i).getConn() ;
IServiceCapableConnection sc = (IServiceCapableConnection) conn;
sc.invoke("removeUser_byCall", new Object[]{userName});
}
updateRoomsNum (roomId,"del") ;
super.roomLeave(client, s) ;
}
/**
* 关闭房间
*/
public void roomStop(IScope s) {
super.roomStop(s) ;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
flex多人多房间 聊天室
共114个文件
svn-base:27个
format:15个
entries:15个
1星 需积分: 9 52 下载量 178 浏览量
2010-07-02
18:13:40
上传
评论
收藏 903KB RAR 举报
温馨提示
flex + red5 开发聊天室,即时聊天采用 ShareObject.
资源推荐
资源详情
资源评论
收起资源包目录
flex多人多房间 聊天室 (114个子文件)
.actionScriptProperties 904B
all-wcprops 584B
all-wcprops 541B
all-wcprops 460B
all-wcprops 458B
all-wcprops 458B
all-wcprops 386B
all-wcprops 271B
all-wcprops 230B
all-wcprops 216B
all-wcprops 198B
all-wcprops 93B
all-wcprops 89B
all-wcprops 81B
all-wcprops 79B
all-wcprops 77B
UpdateRoomsNumEvent.as 418B
ScopeTest.class 7KB
ChatSharedObjectListener.class 2KB
UserVO.class 1KB
MyFirstApp.class 1KB
.classpath 320B
history.css 371B
history.css 371B
entries 894B
entries 836B
entries 750B
entries 690B
entries 629B
entries 596B
entries 588B
entries 417B
entries 352B
entries 345B
entries 274B
entries 271B
entries 270B
entries 216B
entries 202B
.flexProperties 134B
format 2B
format 2B
format 2B
format 2B
format 2B
format 2B
format 2B
format 2B
format 2B
format 2B
format 2B
format 2B
format 2B
format 2B
format 2B
index.template.html 4KB
Red5Test1.html 4KB
scope.html 4KB
room.html 4KB
historyFrame.html 807B
historyFrame.html 807B
ScopeTest.java 6KB
ChatSharedObjectListener.java 1KB
UserVO.java 986B
MyFirstApp.java 646B
history.js 24KB
history.js 24KB
AC_OETags.js 8KB
AC_OETags.js 8KB
RoomView.mxml 6KB
Room.mxml 3KB
RoomItem.mxml 1KB
Scope.mxml 1KB
Red5Test1.mxml 990B
org.eclipse.core.resources.prefs 88B
.project 472B
.project 381B
red5-web.properties 93B
log4j.properties 57B
room0.red5 105B
history.js.svn-base 24KB
AC_OETags.js.svn-base 8KB
ScopeTest.java.svn-base 7KB
RoomView.mxml.svn-base 6KB
index.template.html.svn-base 4KB
Room.mxml.svn-base 4KB
RoomItem.mxml.svn-base 1KB
ChatSharedObjectListener.java.svn-base 1KB
Scope.mxml.svn-base 1KB
Red5Test1.mxml.svn-base 990B
UserVO.java.svn-base 986B
red5-web.xml.svn-base 950B
.actionScriptProperties.svn-base 904B
historyFrame.html.svn-base 807B
playerProductInstall.swf.svn-base 657B
MyFirstApp.java.svn-base 646B
.project.svn-base 472B
web.xml.svn-base 457B
UpdateRoomsNumEvent.as.svn-base 418B
.project.svn-base 381B
共 114 条
- 1
- 2
资源评论
- kalin5202012-10-22测试了,不行,没完善
如生
- 粉丝: 46
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功