抛弃LCDS和FMS,在tomcat下开发Red5应用(第三篇)-ApplicationAdapte

一个完整的应用过程包括(1)应用程序启动。 (2)客户端建立连接。 (3)允许/拒绝客户端连接。 (4)客户端断开连接。(5)应用程序停止。这几个基本的动作。这些动作都在ApplicationAdapter中进行了实现,我们自己写的类只需要继承该类即可。对比FMS的各个过程,具体见Red5的安装安装版的安装目录下的MigrationGuide.txt文件。该迁移向导对比了FMS和Red5在上述过程中的方法对应。

=============== ===============
FCS / FMS       Red5
=============== ===============
onAppStart      appStart               (1)应用程序启动
                roomStart
onAppStop       appStop               (5)应用程序停止
                roomStop
onConnect       appConnect         (2)客户端建立连接
                roomConnect
                appJoin
                roomJoin
onDisconnect    appDisconnect    (4)客户端断开连接
                roomDisconnect
                appLeave
                roomLeave
=============== ===============

再看如何允许/拒绝客户端连接。FMS提供了方法`acceptConnection` 和`rejectConnection`进行允许和拒绝客户端连接的操作。而在Red5中,允许一个客户端连接不需要特别的操作,只需要在appConnect或roomConnect方法中返回"true"的布尔值就可以了。拒绝客户端连接,只需要调用rejectClient方法就可以了,rejectClient方法可以带一个参数以告知客户端是什么原因拒绝客户端连接。

下面我们通过一个实例来观察上述的各个过程:

假定如下场景:我们在服务器端有一个保存连接当前服务器的用户的列表,以连接时输入的用户名为标示,当有重复的用户名的客户端连接时,服务器拒绝该客户端连接,并告知客户端拒绝连接的原因。

1.修改上一篇的服务器端代码(Application.java):

Java代码   收藏代码
  1. package red5.example.red5server;     
  2.     
  3. import java.util.ArrayList;  
  4. import java.util.Iterator;  
  5. import java.util.List;  
  6.   
  7. import org.red5.server.adapter.ApplicationAdapter;     
  8. import org.red5.server.api.IConnection;  
  9. import org.red5.server.api.IScope;  
  10. import org.red5.server.api.service.IServiceCapableConnection;  
  11.     
  12. public class Application extends ApplicationAdapter {   
  13.       
  14.     List userList = null;  
  15.       
  16.     @Override  
  17.     public boolean appStart(IScope scope) {  
  18.         System.out.println("red5Server--上下文启动...");  
  19.         userList = new ArrayList();  
  20.         System.out.println("初始化用户列表结束...");  
  21.         return super.appStart(scope);  
  22.     }  
  23.       
  24.     @Override  
  25.     public boolean appConnect(IConnection conn, Object[] args) {  
  26.         System.out.println("red5Server--有客户端要建立连接...");  
  27.         String userName = args[0].toString();  
  28.         int cnt = 0;  
  29.         for (Iterator iter = userList.iterator(); iter.hasNext();) {  
  30.             IConnection element = (IConnection) iter.next();  
  31.             if(userName.equals(element.getAttribute("userName").toString()))  
  32.             {  
  33.                 rejectClient("已经有一个"+userName+"在连接中,请使用其他用户名连接...");  
  34.             }  
  35.             cnt++;  
  36.         }  
  37.         if(cnt == userList.size())  
  38.         {  
  39.             conn.setAttribute("userName", userName);  
  40.             userList.add(conn);  
  41.         }  
  42.         //if(cnt == userList.size())  
  43.             return super.appConnect(conn, args);  
  44.         //else  
  45.             //return false;  
  46.     }  
  47.       
  48.     @Override  
  49.     public void appDisconnect(IConnection conn) {  
  50.         System.out.println("red5Server--客户端断开连接...");  
  51.         for (Iterator iter = userList.iterator(); iter.hasNext();) {  
  52.             IConnection element = (IConnection) iter.next();  
  53.             if(element.getAttribute("userName").toString().equals(conn.getAttribute("userName").toString()))  
  54.             {  
  55.                 userList.remove(element);  
  56.                 break;  
  57.             }  
  58.         }  
  59.         //IServiceCapableConnection client = (IServiceCapableConnection) conn;  
  60.         super.appDisconnect(conn);  
  61.     }  
  62.       
  63.     @Override  
  64.     public void appStop(IScope scope) {  
  65.         System.out.println("red5Server--上下文停止...");  
  66.         super.appStop(scope);  
  67.     }  
  68. }    

 

2.编写客户端代码进行测试(red5client002.mxml):

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">  
  3.   
  4.     <mx:Script>  
  5.         <![CDATA[ 
  6.             import flash.net.*; 
  7.             import flash.events.*;    
  8.             import flash.utils.*;    
  9.             import mx.controls.*;  
  10.              
  11.             private var nc:NetConnection; 
  12.              
  13.             public function connServer():void { 
  14.                 nc = new NetConnection();                   
  15.                 nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus);    
  16.                 nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, netSecurityError);    
  17.                 nc.connect(txtServerURL.text,txtUserName.text);    
  18.             } 
  19.              
  20.             private function netStatus(event:NetStatusEvent):void {  
  21.                 //txtResult.text = "";   
  22.                 var connStatus:String = event.info.code; 
  23.                 //Alert.show(connStatus); 
  24.                 txtResult.text += connStatus;  
  25.                 if(connStatus == "NetConnection.Connect.Success") {   
  26.                     //登录成功,不做处理 
  27.                 }      
  28.                 else if(connStatus == "NetConnection.Connect.Rejected") 
  29.                 { 
  30.                     //登录被拒绝 
  31.                     txtResult.text += event.info.application; 
  32.                 } 
  33.             }    
  34.             
  35.             private function netSecurityError(event:SecurityErrorEvent):void {    
  36.                 Alert.show("netSecurityError: " + event);    
  37.             } 
  38.         ]]>  
  39.     </mx:Script>  
  40.   
  41.     <mx:Label x="10" y="38" text="输入用户名:"/>  
  42.     <mx:TextInput x="83" y="36" id="txtUserName" width="167"/>  
  43.     <mx:Label x="10" y="10" text="连接的服务器:"/>  
  44.     <mx:TextInput x="83" y="8" id="txtServerURL" text="rtmp://localhost/red5Server"/>  
  45.     <mx:Button x="10" y="64" label="连接到red5服务器" width="240" click="connServer()"/>  
  46.     <mx:TextArea x="10" y="94" width="240" height="154" id="txtResult"/>  
  47.       
  48. </mx:Application>  

 

3.启动tomcat,在浏览器输入http://localhost:8080/red5/red5client002.html ,在输入用户名的文本框中输入“testuser”,点击“连接到red5服务器”按钮,看到结果文本域显示“NetConnection.Connect.Success”,再开一个浏览器,同上操作,可以看到结果文本域里显示“NetConnection.Connect.Rejected已经有一个testuser在连接中,请使用其他用户名连接...NetConnection.Connect.Closed”。

 

最后停止tomcat服务器,再观察tomcat的控制台,应用上下文将整个过程的输出语句都打印了一遍,完成了整个过程。

 

下一篇将讲解Flex客户端和后台方法相互调用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值