一个完整的应用过程包括(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):
- package red5.example.red5server;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import org.red5.server.adapter.ApplicationAdapter;
- import org.red5.server.api.IConnection;
- import org.red5.server.api.IScope;
- import org.red5.server.api.service.IServiceCapableConnection;
- public class Application extends ApplicationAdapter {
- List userList = null;
- @Override
- public boolean appStart(IScope scope) {
- System.out.println("red5Server--上下文启动...");
- userList = new ArrayList();
- System.out.println("初始化用户列表结束...");
- return super.appStart(scope);
- }
- @Override
- public boolean appConnect(IConnection conn, Object[] args) {
- System.out.println("red5Server--有客户端要建立连接...");
- String userName = args[0].toString();
- int cnt = 0;
- for (Iterator iter = userList.iterator(); iter.hasNext();) {
- IConnection element = (IConnection) iter.next();
- if(userName.equals(element.getAttribute("userName").toString()))
- {
- rejectClient("已经有一个"+userName+"在连接中,请使用其他用户名连接...");
- }
- cnt++;
- }
- if(cnt == userList.size())
- {
- conn.setAttribute("userName", userName);
- userList.add(conn);
- }
- //if(cnt == userList.size())
- return super.appConnect(conn, args);
- //else
- //return false;
- }
- @Override
- public void appDisconnect(IConnection conn) {
- System.out.println("red5Server--客户端断开连接...");
- for (Iterator iter = userList.iterator(); iter.hasNext();) {
- IConnection element = (IConnection) iter.next();
- if(element.getAttribute("userName").toString().equals(conn.getAttribute("userName").toString()))
- {
- userList.remove(element);
- break;
- }
- }
- //IServiceCapableConnection client = (IServiceCapableConnection) conn;
- super.appDisconnect(conn);
- }
- @Override
- public void appStop(IScope scope) {
- System.out.println("red5Server--上下文停止...");
- super.appStop(scope);
- }
- }
2.编写客户端代码进行测试(red5client002.mxml):
- <?xml version="1.0" encoding="utf-8"?>
- <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
- <mx:Script>
- <![CDATA[
- import flash.net.*;
- import flash.events.*;
- import flash.utils.*;
- import mx.controls.*;
- private var nc:NetConnection;
- public function connServer():void {
- nc = new NetConnection();
- nc.addEventListener(NetStatusEvent.NET_STATUS, netStatus);
- nc.addEventListener(SecurityErrorEvent.SECURITY_ERROR, netSecurityError);
- nc.connect(txtServerURL.text,txtUserName.text);
- }
- private function netStatus(event:NetStatusEvent):void {
- //txtResult.text = "";
- var connStatus:String = event.info.code;
- //Alert.show(connStatus);
- txtResult.text += connStatus;
- if(connStatus == "NetConnection.Connect.Success") {
- //登录成功,不做处理
- }
- else if(connStatus == "NetConnection.Connect.Rejected")
- {
- //登录被拒绝
- txtResult.text += event.info.application;
- }
- }
- private function netSecurityError(event:SecurityErrorEvent):void {
- Alert.show("netSecurityError: " + event);
- }
- ]]>
- </mx:Script>
- <mx:Label x="10" y="38" text="输入用户名:"/>
- <mx:TextInput x="83" y="36" id="txtUserName" width="167"/>
- <mx:Label x="10" y="10" text="连接的服务器:"/>
- <mx:TextInput x="83" y="8" id="txtServerURL" text="rtmp://localhost/red5Server"/>
- <mx:Button x="10" y="64" label="连接到red5服务器" width="240" click="connServer()"/>
- <mx:TextArea x="10" y="94" width="240" height="154" id="txtResult"/>
- </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客户端和后台方法相互调用。