上一遍是客户端,此处是服务端代码
- packagewm;
- importjava.util.ArrayList;
- importjava.util.HashMap;
- importjava.util.List;
- importorg.apache.commons.logging.Log;
- importorg.apache.commons.logging.LogFactory;
- importorg.red5.server.adapter.ApplicationAdapter;
- importorg.red5.server.api.IClient;
- 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;
- importwm.vo.UserVO;
- /**
- *
- *@authorluqinglong@wanmei.com
- *
- */
- publicclassScopeTestextendsApplicationAdapter{
- protectedstaticLoglog=LogFactory.getLog(ScopeTest.class.getName());
- /**
- *房间用户列表
- *String:房间名称
- *List:该房间的用户
- */
- privateHashMap<String,List<UserVO>>users=newHashMap<String,List<UserVO>>();
- /**
- *客户端列表
- */
- privateList<IConnection>clientConnList=newArrayList<IConnection>();
- /**
- *同步
- */
- privateISharedObjectshareObj;
- publicbooleanappStart(IScopearg0){
- System.out.println("启动appStart");
- for(inti=0;i<10;i++){
- users.put("room"+i,newArrayList<UserVO>());
- System.out.println("创建房间:room"+i);
- }
- returnsuper.appStart(arg0);
- }
- /**
- *取得每个房间的人数
- */
- publicStringroomsInfo(){
- StringBufferrooms=newStringBuffer();
- rooms.append("<root>");
- for(inti=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());
- returnrooms.toString();
- }
- /**
- *与服务端建立连接
- */
- publicbooleanconnect(IConnectionconn,IScopescope,Object[]params){
- System.out.println("与服务端建立连接...................作用域名称为:"+scope.getName());
- returnsuper.connect(conn,scope,params);
- }
- /**
- *与客户端断开连接
- */
- publicvoiddisconnect(IConnectionconn,IScopescope){
- System.out.println("与客户端断开连接....................");
- clientConnList.remove(conn);
- }
- /**
- *房间第一次启动
- */
- publicbooleanroomStart(IScopescope){
- System.out.println("初始化房间:"+scope.getName());
- //创建sharedObject
- this.createSharedObject(scope,scope.getName(),true);
- shareObj=this.getSharedObject(scope,scope.getName(),true);
- shareObj.addSharedObjectListener(newChatSharedObjectListener());
- returnsuper.roomStart(scope);
- }
- /**
- *用户进入房间
- */
- publicbooleanroomConnect(IConnectioncon,Object[]arg1){
- IScopescope=con.getScope();
- StringuserName=(String)arg1[0];
- StringroomId=scope.getName();
- System.out.println("用户名:"+userName);
- List<UserVO>users=this.users.get(roomId);
- /*
- *每个房间最多3个人
- */
- if(users.size()>=3){
- System.out.println("房间人数已满.......................");
- returnfalse;
- }
- /*
- *设置用户信息。包括用户名、对应的连接、所在的房间id
- */
- UserVOuser=newUserVO();
- user.setUserName(userName);
- user.setConn(con);
- user.setRoomId(roomId);
- updateCurrentRoomClients(user);
- /*
- *把用户加入房间
- */
- users.add(user);
- con.getClient().setAttribute("userName",userName);
- updateRoomsNum(roomId,"add");
- /**
- *通知该房间其他用户
- */
- returnsuper.roomConnect(con,arg1);
- }
- /**
- *通知当前房间其他用户,有新用户上线
- */
- publicvoidupdateCurrentRoomClients(UserVOuser){
- /*
- *得到改房间所有用户
- */
- List<UserVO>userList=this.users.get(user.getRoomId());
- StringBufferuserXml=newStringBuffer();
- userXml.append("<root>")
- .append("<user>")
- .append("<name>"+user.getUserName()+"</name>")
- .append("<id>"+user.getId()+"</id>")
- .append("</user>")
- .append("</root>");
- for(inti=0;i<userList.size();i++){
- IConnectionconn=userList.get(i).getConn();
- IServiceCapableConnectionsc=(IServiceCapableConnection)conn;
- sc.invoke("addNewUser_byCall",newObject[]{userXml.toString()});
- }
- }
- /**
- *更新所有房间的人数显示
- *@paramroomId:房间ID
- *@paramfalgadd为:增加用户del:为删除
- */
- publicvoidupdateRoomsNum(StringroomId,Stringflag){
- List<IConnection>conns=this.clientConnList;
- for(inti=0;i<conns.size();i++){
- IConnectionconn=conns.get(i);
- IServiceCapableConnectionsc=(IServiceCapableConnection)conn;
- sc.invoke("updateRoomsNum_byCall",newObject[]{roomId,flag});
- }
- }
- /**
- *取得该房间的在线用户
- *@returnstringasxml
- */
- publicStringusers(StringroomId){
- List<UserVO>users=this.users.get(roomId);
- StringBufferuserXml=newStringBuffer();
- userXml.append("<root>");
- for(inti=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>");
- returnuserXml.toString();
- }
- /**
- *用户离开房间
- */
- publicvoidroomLeave(IClientclient,IScopes){
- StringuserName=client.getAttribute("userName").toString();
- StringroomId=s.getName();
- System.out.println("用户离开......................."+userName+"size:1+"+users.get(roomId).size());
- /*
- *从用户列表中删除该用户
- */
- UserVOu=newUserVO();
- u.setUserName(userName);
- users.get(roomId).remove(u);
- System.out.println("size2:"+users.get(roomId).size());
- /*
- *得到改房间所有用户
- */
- List<UserVO>userList=this.users.get(roomId);
- for(inti=0;i<userList.size();i++){
- IConnectionconn=userList.get(i).getConn();
- IServiceCapableConnectionsc=(IServiceCapableConnection)conn;
- sc.invoke("removeUser_byCall",newObject[]{userName});
- }
- updateRoomsNum(roomId,"del");
- super.roomLeave(client,s);
- }
- /**
- *关闭房间
- */
- publicvoidroomStop(IScopes){
- super.roomStop(s);
- }
- }