red5 学习6 --多人聊天室服务端

上一遍是客户端,此处是服务端代码


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 [email protected] * */ public class ScopeTest extends ApplicationAdapter { protected static Log log = LogFactory.getLog(ScopeTest.class.getName()); /** * 房间用户列表 * String : 房间名称 * List :该房间的用户 */ private HashMap> users = new HashMap > () ; /** * 客户端列表 */ private List clientConnList = new ArrayList () ; /** * 同步 */ 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()) ; System.out.println ("创建房间: room"+i) ; } return super.appStart(arg0); } /** * 取得每个房间的人数 */ public String roomsInfo () { StringBuffer rooms = new StringBuffer() ; rooms.append("") ; for (int i=0 ; i") .append("").append("room"+i).append("") .append("").append(users.get("room"+i).size()).append("") .append(""); } rooms.append("") ; 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 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 userList = this.users.get(user.getRoomId()) ; StringBuffer userXml = new StringBuffer () ; userXml.append("") .append("") .append(""+user.getUserName()+"") .append(""+user.getId()+"") .append("") .append("") ; 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 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 users = this.users.get(roomId) ; StringBuffer userXml = new StringBuffer () ; userXml.append(""); for (int i=0 ; i< users.size() ; i++) { userXml.append("") .append(""+users.get(i).getUserName()+"") .append(""+users.get(i).getId()+"") .append(""); } userXml.append(""); 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 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) ; } }

你可能感兴趣的:(Red5学习笔记)