`
nanjingjiangbiao_T
  • 浏览: 2573504 次
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

red5 --多人聊天室服务端代码 .

 
阅读更多

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


[java:nogutter] view plaincopyprint?
  1. packagewm;
  2. importjava.util.ArrayList;
  3. importjava.util.HashMap;
  4. importjava.util.List;
  5. importorg.apache.commons.logging.Log;
  6. importorg.apache.commons.logging.LogFactory;
  7. importorg.red5.server.adapter.ApplicationAdapter;
  8. importorg.red5.server.api.IClient;
  9. importorg.red5.server.api.IConnection;
  10. importorg.red5.server.api.IScope;
  11. importorg.red5.server.api.Red5;
  12. importorg.red5.server.api.service.IServiceCapableConnection;
  13. importorg.red5.server.api.so.ISharedObject;
  14. importwm.vo.UserVO;
  15. /**
  16. *
  17. *@authorluqinglong@wanmei.com
  18. *
  19. */
  20. publicclassScopeTestextendsApplicationAdapter{
  21. protectedstaticLoglog=LogFactory.getLog(ScopeTest.class.getName());
  22. /**
  23. *房间用户列表
  24. *String:房间名称
  25. *List:该房间的用户
  26. */
  27. privateHashMap<String,List<UserVO>>users=newHashMap<String,List<UserVO>>();
  28. /**
  29. *客户端列表
  30. */
  31. privateList<IConnection>clientConnList=newArrayList<IConnection>();
  32. /**
  33. *同步
  34. */
  35. privateISharedObjectshareObj;
  36. publicbooleanappStart(IScopearg0){
  37. System.out.println("启动appStart");
  38. for(inti=0;i<10;i++){
  39. users.put("room"+i,newArrayList<UserVO>());
  40. System.out.println("创建房间:room"+i);
  41. }
  42. returnsuper.appStart(arg0);
  43. }
  44. /**
  45. *取得每个房间的人数
  46. */
  47. publicStringroomsInfo(){
  48. StringBufferrooms=newStringBuffer();
  49. rooms.append("<root>");
  50. for(inti=0;i<users.size();i++){
  51. rooms.append("<room>")
  52. .append("<id>").append("room"+i).append("</id>")
  53. .append("<num>").append(users.get("room"+i).size()).append("</num>")
  54. .append("</room>");
  55. }
  56. rooms.append("</root>");
  57. clientConnList.add(Red5.getConnectionLocal());
  58. returnrooms.toString();
  59. }
  60. /**
  61. *与服务端建立连接
  62. */
  63. publicbooleanconnect(IConnectionconn,IScopescope,Object[]params){
  64. System.out.println("与服务端建立连接...................作用域名称为:"+scope.getName());
  65. returnsuper.connect(conn,scope,params);
  66. }
  67. /**
  68. *与客户端断开连接
  69. */
  70. publicvoiddisconnect(IConnectionconn,IScopescope){
  71. System.out.println("与客户端断开连接....................");
  72. clientConnList.remove(conn);
  73. }
  74. /**
  75. *房间第一次启动
  76. */
  77. publicbooleanroomStart(IScopescope){
  78. System.out.println("初始化房间:"+scope.getName());
  79. //创建sharedObject
  80. this.createSharedObject(scope,scope.getName(),true);
  81. shareObj=this.getSharedObject(scope,scope.getName(),true);
  82. shareObj.addSharedObjectListener(newChatSharedObjectListener());
  83. returnsuper.roomStart(scope);
  84. }
  85. /**
  86. *用户进入房间
  87. */
  88. publicbooleanroomConnect(IConnectioncon,Object[]arg1){
  89. IScopescope=con.getScope();
  90. StringuserName=(String)arg1[0];
  91. StringroomId=scope.getName();
  92. System.out.println("用户名:"+userName);
  93. List<UserVO>users=this.users.get(roomId);
  94. /*
  95. *每个房间最多3个人
  96. */
  97. if(users.size()>=3){
  98. System.out.println("房间人数已满.......................");
  99. returnfalse;
  100. }
  101. /*
  102. *设置用户信息。包括用户名、对应的连接、所在的房间id
  103. */
  104. UserVOuser=newUserVO();
  105. user.setUserName(userName);
  106. user.setConn(con);
  107. user.setRoomId(roomId);
  108. updateCurrentRoomClients(user);
  109. /*
  110. *把用户加入房间
  111. */
  112. users.add(user);
  113. con.getClient().setAttribute("userName",userName);
  114. updateRoomsNum(roomId,"add");
  115. /**
  116. *通知该房间其他用户
  117. */
  118. returnsuper.roomConnect(con,arg1);
  119. }
  120. /**
  121. *通知当前房间其他用户,有新用户上线
  122. */
  123. publicvoidupdateCurrentRoomClients(UserVOuser){
  124. /*
  125. *得到改房间所有用户
  126. */
  127. List<UserVO>userList=this.users.get(user.getRoomId());
  128. StringBufferuserXml=newStringBuffer();
  129. userXml.append("<root>")
  130. .append("<user>")
  131. .append("<name>"+user.getUserName()+"</name>")
  132. .append("<id>"+user.getId()+"</id>")
  133. .append("</user>")
  134. .append("</root>");
  135. for(inti=0;i<userList.size();i++){
  136. IConnectionconn=userList.get(i).getConn();
  137. IServiceCapableConnectionsc=(IServiceCapableConnection)conn;
  138. sc.invoke("addNewUser_byCall",newObject[]{userXml.toString()});
  139. }
  140. }
  141. /**
  142. *更新所有房间的人数显示
  143. *@paramroomId:房间ID
  144. *@paramfalgadd为:增加用户del:为删除
  145. */
  146. publicvoidupdateRoomsNum(StringroomId,Stringflag){
  147. List<IConnection>conns=this.clientConnList;
  148. for(inti=0;i<conns.size();i++){
  149. IConnectionconn=conns.get(i);
  150. IServiceCapableConnectionsc=(IServiceCapableConnection)conn;
  151. sc.invoke("updateRoomsNum_byCall",newObject[]{roomId,flag});
  152. }
  153. }
  154. /**
  155. *取得该房间的在线用户
  156. *@returnstringasxml
  157. */
  158. publicStringusers(StringroomId){
  159. List<UserVO>users=this.users.get(roomId);
  160. StringBufferuserXml=newStringBuffer();
  161. userXml.append("<root>");
  162. for(inti=0;i<users.size();i++){
  163. userXml.append("<user>")
  164. .append("<name>"+users.get(i).getUserName()+"</name>")
  165. .append("<id>"+users.get(i).getId()+"</id>")
  166. .append("</user>");
  167. }
  168. userXml.append("</root>");
  169. returnuserXml.toString();
  170. }
  171. /**
  172. *用户离开房间
  173. */
  174. publicvoidroomLeave(IClientclient,IScopes){
  175. StringuserName=client.getAttribute("userName").toString();
  176. StringroomId=s.getName();
  177. System.out.println("用户离开......................."+userName+"size:1+"+users.get(roomId).size());
  178. /*
  179. *从用户列表中删除该用户
  180. */
  181. UserVOu=newUserVO();
  182. u.setUserName(userName);
  183. users.get(roomId).remove(u);
  184. System.out.println("size2:"+users.get(roomId).size());
  185. /*
  186. *得到改房间所有用户
  187. */
  188. List<UserVO>userList=this.users.get(roomId);
  189. for(inti=0;i<userList.size();i++){
  190. IConnectionconn=userList.get(i).getConn();
  191. IServiceCapableConnectionsc=(IServiceCapableConnection)conn;
  192. sc.invoke("removeUser_byCall",newObject[]{userName});
  193. }
  194. updateRoomsNum(roomId,"del");
  195. super.roomLeave(client,s);
  196. }
  197. /**
  198. *关闭房间
  199. */
  200. publicvoidroomStop(IScopes){
  201. super.roomStop(s);
  202. }
  203. }

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics