EasyDarwin

面向企业级的流媒体平台框架

EasyDarwin开始于2013年,遵循 Apple开源License APSL,为了敏捷流媒体服务器开发和简化企业流媒体应用开发而诞生的。

详细 >>

Red5应用实例


以登录过程为例,来帮助大家更好的理解 Red5 中的一些概念和模型。本应用实例中,Server 端基于 Red5 0.9 RC2 采用 Java 编写,而 Client 端则采用 Action Script。...

以登录过程为例,来帮助大家更好的理解 Red5 中的一些概念和模型。本应用实例中,Server 端基于 Red5 0.9 RC2 采用 Java 编写,而 Client 端则采用 Action Script。

项目结构
项目结构

由于 Red5 是在 Tomcat 中运行的,因此 Red5 项目与普通 JAVAEE 项目结构类似。不同点在于,Red5 的配置文件需要加上“red5-”前缀,在 Tomcat 启动时,所有“red5-”被默认为 Red5 Server 的配置文件而不会被 Tomcat 加载,而后当 Red5 启动时才会加载相应的配置文件。让我们来看看 red5-web.xml 中都有哪些组成部分。

 

 1. red5-web.xml 中 Context 部分

<bean id="web.context" class="org.red5.server.Context" autowire="byType">

<property name="scopeResolver" ref="red5.scopeResolver" />

<property name="serviceInvoker" ref="global.serviceInvoker" />

<property name="mappingStrategy" ref="global.mappingStrategy" />

<property name="clientRegistry" ref="IloveClientRegistry" /><

/bean>

 

 1 中前三项 Property 为 Red5 项目默认的属性。第四项“ClientRegistry”为项目自定义的 Context, 主要用于实现用户注册的功能。

 

 2. red5-web.xml 中 Scope 部分

<bean id="web.scope" class="org.red5.server.WebScope" init-method="register">

<property name="server" ref="red5.server" />

<property name="parent" ref="global.scope" />

<property name="context" ref="web.context" />

<property name="handler" ref="web.handler" />

<property name="contextPath" value="${webapp.contextPath}" />

<property name="virtualHosts" value="${webapp.virtualHosts}" />

</bean>

 2 中定义了 Red5 项目中 Scope 的默认值。如需要可以添加自己定义的 Scope,并给它赋值。

 

3. red5-web.xml 中 Handler 部分

<bean id="web.handler" class="org.red5.server.webapps.Ilove.Application">

<property name="userInfoService" ref="userInfoService" />

</bean>

3 重载了 web.handler,因此当有 Client 与 Server 提出连接请求时,org.red5.server.webapps.Ilove.Application 将被用于处理客户请求。

接下来我们看下如何实现从 Flash 客户端调用 Red5 应用的方法,以及如何使用 Scope 来判断用户登录状态。

客户端登录

客户端登录

 

登录界面

登录界面

 

“客户端登录”中展示了 Flash 客户端中 ActionScript 面对不同 Connection 状态的处理方法。由 Flash 客户端发起的登录请求,首先需要判断当前与 Server 的 Connection 状态, 只有状态为”NetConnection.Connect,Sucess”时, 才可以向 Server 端调用方法“logicProcess”。 “登陆界面”中展示了不同 Connection 状态时 Flash 客户端会给出的提示。

 

4. LoginInterface

public interface LoginInterface extends IStreamAwareScopeHandler {

……

//用户登录时服务器端调用当前 connection 的方法

public String loginProcess(String[] args) throws FileNotFoundException,

ParserConfigurationException, SAXException, IOException;

//用户登录时服务器端报错调用当前 connection 的方法

public void systemError();

/**用户登出时客户端端调用当前 connection 的方法

*

* @param userName 需要剔除的用户名

*/

public void logoutProcess(String userName);

……

}

如4 所示,org.red5.server.webapps.Ilove.Application 实现了 LoginInterface 接口, 其中定义了一些客户端可见的方法名称。因为 org.red5.server.webapps.Ilove.Application 被定义为项目的 Handler,类中所有 public 方法都可以被客户端调用。

 

5. 用户登录

public String loginProcess(String[] args) throws FileNotFoundException,

ParserConfigurationException, SAXException, IOException {

final IConnection conn = Red5.getConnectionLocal();

if (conn.getClient() == null)

return SystemContent.NO_ENTRY;

final IScope scope = conn.getScope();

final IClient client = conn.getClient();

final int code = (Integer) client.getAttribute("codeName");

//检查当前登录冲突

if (code == SystemContent.STATUS_CODE_DUPLICATEUSER) {

//此用户名已登录,notify 客户端不允许重复登录

if (model.statusMap.get(args[0]))

return SystemContent.NO_ENTRY;

//如果没有用户登录,则更新数据库中 session 值为当前用户

else {

this.userInfoService.updateSession(args[0], (String) client

.getAttribute("currentId"));

}

}

//如果通过验证,则 client 应该为 IloveStreamClient 类型

if (client instanceof IloveStreamClient) {

boolean authenticated = ((IloveStreamClient) client)

.isAuthenticated(); //当前验证状态

if (authenticated) {

synchronized (model.statusMap) {

model.statusMap.put(args[0], true);

refreshUserList(conn, args[0], "refresh");

refreshUserList(conn, args[0], "add");

}

invokeClientMethod(conn, "declarePublicSo",

new Object[] { "chatingSO" }, null);

messageAdapter

.sendPublicMessage(so, "欢迎登录!" + args[0], "系统机器人");

final String scheduleName = this.addScheduledJob(5000,

new IloveUserListChecker(conn, args[0]));

scope.setAttribute((String) client.getAttribute("currentId"),

scheduleName);

return args[0] + " found";

}

}

return args[0] + " not found";

}

如 5 所示,程序首先通过 Red5 的 GlobalScope 获取当前用户的 Credential,因为每个 Connection 在 Scope 中都是独立存在的。登录过程中会判断当前用户是否重复登录,或者登录信息是否正确。只有当用户为 Authenticated 状态时,服务器端才会调用 Flash 客户端的方法,同时生成 shared Object 以帮助 Flash 客户端初始化界面。



------------------------------ 分割线 ------------------------------
本站文章除注明转载外,均为本站原创或编辑,欢迎大家转载,但请务必注明出处,尊重他人成果,谢谢。
转载请注明:EasyDarwin;非本站文章均来自互联网,转载目的在于传递更多信息,并不代表本站赞同其观点和对其真实性负责。
文章中如果有错误可联系:johnson@easydarwin.org
推荐文章
H.265技术经过2年发展,我们认为H.265高清监......>
近年来,4K超高清、H.265编码技术、视频智能......>
随着科技的发展速度,医疗行业的信息化建设......>
商场里的监控视频除了防盗,还可以做什么呢......>
家用网络摄像机则通过自身的功能帮助消费者......>
最近更新
监控行业正在发生改变,摄像头的数量在增加......>
视频编码技术是对前端摄像机采集过来的数字......>
随着网络的不断发展和应用需求的多样化,对......>
太阳能监控既从早期的贵族金字塔走向了实用......>
随着监控技术的不断发展,已经有越来越多的......>
友情链接 | 申请链接
EasyDarwin官方微信!