存档

2009年5月 的存档

在windows平台下搭建bigbluebutton服务

2009年5月24日

下面一步步讲述如何在windows平台下搭建bigbluebutton.至少需要1GB内存和8GB磁盘空间(其实是这样就运行得更好而已).

要运行bigbluebutton需要依赖以下服务:

1.bigbluebutton(建立在red5基础上)

2.activeMQ

3.tomcat

其中tomcat需要两个额外的组件:

1.bigbluebutton.war–一个java的上传组件

2.client–包含swf的可运行的bigbluebutton客户端文件

其中bigbluebutton.war使用两个命令行程序来转换pdf文件上传:

1.pdftk–把整个pdf文件分割为若干个小文件.

2.pdf2swf–把pdf文件转换为swf文件

 

下面开始部署.

一.安装基本程序.

1.java Development Kit.这个就不多说了.安装完以后设置环境变量,把JAVA_HOME指向到jdk目录

2.activeMQ.下载并安装activeMQ.运行activeMQ.bat,理论上是不会有什么错误的.

3.tomcat.这个也不用多说了.基本上使用java的都会接触过这个服务.

4.然后安装swf工具pdf工具并安装

 

二.安装bigbluebutton客户端文件.

下载最新的bigbluebutton client.文件名为bbb-client(zip)的.解压到tomcat/webapps/root目录下.并且重命名文件名为client(原文件名为bin).

如果正确的话,可以看到如下界面

当然现在还不能登陆的.因为还没有安装red5.

 

三.安装bigbluebutton服务.

下载最新的bbb-server(zip).并且进行解压.下载最新的bigbluebutton-apps(zip)文件,解压到bbb-server/webapps目录.

此时基本已经准备可以登陆了.但是还没有设置会议室以及登陆密码等.

编辑bbb-server\webapps\conference\conferences\conferences.xml,修改为如下内容:

<?xml version="1.0" encoding="UTF-8" ?>
<conference-rooms>
<conference-room>
<name>85115</name>
<mod-password>modpass</mod-password>
<view-password>viewpass</view-password>
</conference-room>
<conference-room>
<name>85101</name>
<mod-password>modpass</mod-password>
<view-password>viewpass</view-password>
</conference-room>
</conference-rooms>

注意,在bigbluebutton-apps.zip文件下是没有conference文件夹的,所以我下载了bigbluebutton-apps.tar.gz文件,把其中的文件夹conference拷贝出来,并且修改其中的conferences.xml文件.

修改tomcat\webapps\ROOT\client\conf\modules.xml文件,告诉文件需要加载那些swf文件,修改内容如下:

<modules>
<module name="VideoModule" url="VideoModule.swf" uri="rtmp://192.168.0.150/oflaDemo" />
<module name="ChatModule" url="ChatModule.swf" uri="rtmp://192.168.0.150/chatServer" />
<module name="ViewersModule" url="ViewersModule.swf" uri="rtmp://192.168.0.150/conference" />
<module name="ListenersModule" url="ListenersModule.swf" uri="rtmp://192.168.0.150/astmeetme" />
<module name="PresentationModule" url="PresentationModule.swf"
uri="rtmp://192.168.0.150/presentation" host="http://192.168.0.150:8080" />
</modules>

其中就是修改其中的监听地址,默认是localhost.只要把文件内所有的localhost改为需要监听的ip地址就可以了.

 

至此,所有工作已经基本完成,启动activeMQ服务,启动tomcat服务,启动bigbluebutton服务,打开浏览器,输入:

http://HOSTNAME:8080/client/BigBlueButton.html

输入如下:

可以看到登陆以后的主界面如下:

此时就可以在局域网内登陆多个用户(我测试的时候是监听的局域网地址),并且可以进行多人聊天,不过没有测试摄像头功能,也没有进行上传pdf文件的扩展.相对来说,这个服务还是有很多需要改进的地方,比如session问题,还有关闭浏览器以后不会自动删除用户之类的.下次再讲解的时候就是搭建开发环境了.

参考:http://code.google.com/p/bigbluebutton/wiki/HowToInstallBigBlueButton

许石南 技术 ,

使用Ext的JsonReader读取本地数据实现grid分页(原)

2009年5月21日

分页基本上是web程序员一个永恒的话题.还好无论什么开发语言我们都有很多控件可以使用.在ext当中,也有分页控件,不过官方提供的例子是使用ScriptTagProxy,而网上绝大部分的例子不是ScriptTagProxy就是HttpProxy来进行数据加载的.但是很多情况下我们不得不进行本地数据加载(比如是两个人使用接口方式进行开发的情况下),下面讲讲我在工作上使用的JsonReader读取本地数据实现grid分页.

要实现本功能,需要注意以下问题:

1.要自定义相关的数据获取函数(第一页,最后一页之类的按钮事件).

2.要定义分页控件的总数(因为默认的情况下,分页控件是加载store的所有数据,这样就不能实现我们的功能).

以上两个问题基本都是分页控件的主要问题(之前用.net的一个分页控件也是这样的问题)

 

阅读全文…

许石南 技术 , , , ,

How to run Red5Phone within BigBlueButton server (译)

2009年5月13日

  • Download Red5 from http://osflash.org/red5/070final, in this instruction we use the Java 6 windows release
  • http://osflash.org/red5/070final下载red5,在本结构中我们使用Java 6 windows release

     

  • Extract the downloaded file (e.g. c:\red5-0.7.0 — let’s call this RED5_HOME)
  • 解压刚才下载的文件(例如: c:\red5-0.7.0 –让我们把这个当作RED5_HOME

     

  • Download the hotfix (http://osflash.org/red5/070hotfix) and put the jetty jars into RED5_HOME/lib. Otherwise, you’ll see this
    Exception in thread "main"
           java.lang.ClassNotFoundException:org.mortbay.jetty.Server
  • 下载修补程序(http://osflash.org/red5/070hotfix) 然后把jetty jars放到RED5_HOME/lib.如果你看到
    Exception in thread "main"
           java.lang.ClassNotFoundException:org.mortbay.jetty.Server

                     

  • You can get the jetty libs from http://red5.googlecode.com/svn/repository/jetty/ Remove the old jetty jar versions. Ignore the update jar files from hotfix link as we are only interested in the jetty jars. If you have SVN installed you can do this by:

    "svn co http://red5.googlecode.com/svn/repository/jetty/"

  • 你可以从http://red5.googlecode.com/svn/repository/jetty/获取 jetty libs.删除旧版本的jetty jar. 忽略修补程序的更新jar文件链接,因为我们只需要jetty jars.如果你是用SVN安装的话你可以按照下面的方法来做:

    "svn co http://red5.googlecode.com/svn/repository/jetty/"

     

  • Download the red5.jar from the red5phone site (http://red5.4ng.net/red5.jar). Put it in RED5_HOME and name it red5-sip-0.7.jar so as not to overwrite the original red5.jar
  • 从red5phone网站下载red5.jar (http://red5.4ng.net/red5.jar). 把它放到 RED5_HOME 目录,并且更改名字为 red5-sip-0.7.jar,这样我们就不会覆盖旧的red5.jar包

     

  • Download the sip app (http://red5.4ng.net/sip.zip) and extract it into RED5_HOME/webapps
  • 下载sip应用 (http://red5.4ng.net/sip.zip),然后把其解压到 RED5_HOME/webapps 目录

     

  • Check if there is a RED5_HOME/wrapper folder. If not, create it. Delete everything inside the wrapper folder.
  • 检查是否有 RED5_HOME/wrapper 文件夹. 如果没有,请创建之. 删除wrapper文件夹内所有东西.

     

  • Copy RED5_HOME/red5.bat to RED5_HOME/wrapper.

    复制 RED5_HOME/red5.batRED5_HOME/wrapper.

    1. Edit the RED5_HOME/wrapper/red5.bat and change

    1. 编辑 RED5_HOME/wrapper/red5.bat 并且改为

    "%JAVA_HOME%/bin/java" -Djava.security.manager
           -Djava.security.policy=conf/red5.policy
           -cp red5.jar;conf;bin org.red5.server.Standalone
      

    to

    "%JAVA_HOME%/bin/java" -Djava.security.manager
    	-Djava.security.policy=../conf/red5.policy
    	-cp ../red5-sip-0.7.jar;../conf;../bin org.red5.server.Standalone
        

    The reason for this is that SIPUser.java assumes red5 was started under a "wrapper" directory.

    这样做的理由是 SIPUser.java 会假设 red5 在 "wrapper" 目录下启动.

    SIPUser.java
    public SIPUser(String sessionID, IConnection service, int sipPort, int rtpPort)
    throws IOException {      p("SIPUser Constructor: sip port " + sipPort + " rtp port:" + rtpPort); try {         String appPath = System.getProperty("user.dir");// removing /wrapper sub folder from path         appPath = appPath.substring(0, (appPath.length() - 8));   
    
             configFile = appPath + "/webapps/sip/sip.cfg";
    
             this.sessionID = sessionID;         this.service = service;         this.sipPort = sipPort;         this.rtpPort = rtpPort;
    
             sipInputStream = new PipedInputStream();         rtmpOutputStream = new PipedOutputStream(sipInputStream);
    
         }  catch (Exception e) {         p("SIPUser constructor: Exception:>\n" + e);
    
         }}
  • Edit webapps/sip/WEB-INF/classes/logback.xml with this change

         <File>log/sip.log</File>

    编辑 webapps/sip/WEB-INF/classes/logback.xml 并作以下修改

         <File>log/sip.log</File>

     

  • Create RED5_HOME/wrapper/log folder. 创建 RED5_HOME/wrapper/log 目录.

  • Run wrapper/red5.bat  运行 wrapper/red5.bat

  • Connect to http://localhost:5080/sip and click on the Flex Phone Template link

    连接到 http://localhost:5080/sip 并且点击 Flex Phone Template link

    Enter relevant information and click Login. Make sure that your SIP user (in Asterisk) does not have a "secret" (password) entry. Otherwise, registration will fail (http://code.google.com/p/red5phone/issues/detail?id=4). If it does not work, take a look at logs/sip.log for clues. You can also use WireShark (http://www.wireshark.org/) to capture packets and determine why your client won’t register.

    输入相关信息并且登陆. 确保你的SIP 用户 (in Asterisk) 没有密码入口.否则注册会失败 (http://code.google.com/p/red5phone/issues/detail?id=4). 如果其不工作, 请查看日志 logs/sip.log . 你也可以使用 WireShark (http://www.wireshark.org/) 去捕捉包来检测你的客户端为什么不能注册.

  • 许石南 技术 , , ,

    BOM—Browser Object Model中的常用部分

    2009年5月12日

    DOM对象经常被讨论。还有一个很重要的对象BOM—Browser Object Model。

    Bom

    1.Top 和Parent 指向的内容是不同的。Top一定指向最外面的那个Window。而Parent指向当前frame的Parentframe。因为浏览器窗口自身被看作所有顶层框架的父框架。
    2.self一个更加全局化的窗口指针,它总是等于window(加入它是因为它比parent更合适。它澄清了正在使用的不是框架的父框架,而是它自身)。如果页面上没有框架,window和self就等于top,frames集合的长度为0。
    3.window对象对操作浏览器窗口(和框架)很有用。有四种方法操作窗口:
    (1) moveBy(dx,dy)——把浏览器窗口相对当前位置水平移动dx个像素,垂直移动dy个像素。dx值为负数,向左移动窗口,dy值为负数,向上移动窗口。
    (2) moveTo(x,y)——移动浏览器窗口,使它的左上角位于用户屏幕的(x,y)处。可以使用负数,不过这样会把部分窗口移出屏幕的可视区域。
    (3) resizeBy(dw,dh)——相对于浏览器窗口的当前大小,把它口的宽度调整dw个像素,高度调整dy个像素。dw为负数,把缩小窗口的宽度,dy为负数,缩小窗口的高度。
    (4) resizeTo(w,h)——把窗口的宽度调整为w,高度调整为h。不能使用负数。
    (5) IE提供了window.screenLeft和window.screenTop对象来判断窗口的位置,但未提供任何判断窗口大小的方法。用 document.body.offsetWidth和document.body. offsetHeight属性可以获取视口的大小(显示HTML页的区域),但它们不是标准属性。
    (6) Mozilla提供window.screenX和window.screenY属性判断窗口的位置。它还提供了window.innerWidth和 window.innerHeight属性来判断视口的大小,window.outerWidth和window.outerHeight属性判断浏览器窗口自身的大小。
    4.window.open()方法打开新的窗口。window.open()有三个参数。如果用已有框架的名字作为 window.open()方法的第二个参数调用它,那么URL所指的页面就会被载入该框架。如果声明的框架名无效,window.open()将打开新窗口,该窗口的特性由第三个参数(特性字符串)决定。如果省略第三个参数,将打开新的浏览器窗口,就像点击了target被设置为_blank的链接。这意味着新浏览器窗口的设置与默认浏览器窗口的设置(工具栏、地址栏和状态栏都是可见的)完全一样。
    5. Alert()的兄弟confirm() prompt()。Prompt返回值是文本框中的值。这三种对话框都是系统窗口,意味着不同的操作系统(有时是不同的浏览器)显示的窗口可能不同。这也意味着不可能控制窗口的字体、颜色等外观。
    6.操作状态栏。状态栏告诉了用户何时在载入页面,何时完成载入页面,对应window.status和window.defaultStatus属性。status可以使状态栏的文本暂时改变,defaultStatus可在用户离开当前页面前一直改变该文本。
    7.调用setTimeout()时,它创建一个数字暂停ID,与操作系统中的进程ID相似。暂停ID本质上是要延迟的进程的ID,在调用 setTimeout()后,就不应该再执行其它的代码。要取消还未执行的暂停,可调用clearTimeout()方法,并将暂停ID传递给它。在执行一组指定的代码前等待一段时间,则使用暂停。用循环setTimeout()可以实现反复调用。如果要反复执行某些代码,就使用时间间隔。 SetInterval(),清除使用clearInterval()。
    8.Histroty.length 反映了历史的多少。
    9.document.write和document.writeln方法帮助Render。如果任何一个方法是在页面载入后调用的,它将抹去页面的内容,显示指定的内容。
    10.location对象。BOM中最有用的对象之一是location对象,它是window对象和document对象的属性(对此没有什么标准,导致了一些混乱)。location对象表示载入窗口的URL,此外,它还可以解析URL:
    (1) hash——如果URL包含#,该方法将返回该符号之后的内容。
    (2) host——服务器的名字(如www.zhangsichu.com)。
    (3) hostname——通常等于host,有时会省略前面的www。
    (4) href——当前载入的页面的完整URL。
    (5) pathname——URL中主机名后的部分。
    (6) port——URL中声明的请求的端口。默认情况下,大多数URL没有端口信息,所以该属性通常是空白的。像 http://localhost:3345/default.asp 这样的URL的port属性等于3345。
    (7) protocol——URL中使用的协议,即双斜杠(//)之前的部分。例如,http://localhost 中的protocol属性等于http: ftp://localhost 的protocol属性等于ftp:。
    (8) search——执行GET请求的URL中的问号(?)后的部分,又称为查询字符串。例如. http://localhost/blogview.asp?Content_Id=60 中的search属性等于?Content_Id=60
    (9) location.href是最常用的属性,用于获取或设置窗口的URL(在这一点上,它类似于document.URL属性)。改变该属性的值,就可导航到新页面。采用这种方式导航,新地址将被加到浏览器的历史栈中,放在前一个页面后,意味着Back按钮会导航到调用了该属性的页面。assign()方法也可实现同样的操作。如果不想让包含脚本的页面能从浏览器历史中访问,使用replace()方法。该方法所作的操作与assign()方法一样,但它多了一步操作,即从浏览器历史中删除包含脚本的页面,这样就不能通过浏览器的Back和Forward按钮访问它了。location对象还有个 reload()方法,可重新载入当前页面。reload()方法有两种模式,即从浏览器缓存中重载,或从服务器端重载。如果是false,则从缓存中载入,如果是true,则从服务器端载入(如果省略参数,默认值为false)。
    11.navigator对象。
    (1) appCodeName——浏览器代码名的字符串表示(如"Mozilla")。
    (2) appName——官方浏览器名的字符串表示。
    (3) appMinorVersion——额外版本信息的字符串表示。
    (4) appVersion——览器版本信息的字符串表示。
    (5) browserLanguage——浏览器或操作系统的语言的字符串表示。
    (6) cookieEnabled——说明是否启用了cookie的Boolean值。
    (7) cpuClass——CPU类别的字符串表示("x86"、"68K"、"Alpha"、"PPC"或"other")。
    (8) javaEnabled()——说明是否启用了Java的Boolean值。
    (9) language——浏览器语言的字符串表示。
    不是每个浏览器都支持这些属性。
    12.screen对象通常包含下列属性。
    (1) availHeight——窗口可以使用的屏幕的高度(像素),其中包括操作系统元素(如Windows工具栏)需要的空间。
    (2) availWidth——窗口可以使用的屏幕的宽度(像素)。
    (3) colorDepth——用户表示颜色的位数。大多数系统采用32位。
    (4) height——屏幕的高度(像素)。
    (5) width——屏幕的宽度(像素)。

    许石南 技术 ,

    关于red5——开源的Flash流媒体服务器red5简介

    2009年5月12日

    在介绍RED5之前,有必要先介绍一下Flash Media Server。

    Flash Media Server,简称FMS,以前也叫Flash Communication Server(FCS),是Flash大家庭里的一员,被称为是目前开发Web音视频应用程序(比如,视频聊天室、视频会议系统、播客系统、音视频留言等等)的最方便最快捷的解决方案。也在web应用程序开发上有着越来越广泛的应用。

    FMS如此的优良功能当然并不是免费提供给广大用户的,4000美金每个点的价格让很多开发人员望而却步。于是,开源的Red5成为人们的新宠。

    Red5是一个采用Java开发开源的Flash流媒体服务器,功能上与fms类似。它支持:把音频(MP3)和视频(FLV)转换成播放流; 录制客户端播放流(只支持FLV);共享对象;现场直播流发布;远程调用。

    Red5使用RSTP作为流媒体传输协议,在其自带的一些示例中演示了在线录制,flash流媒体播放,在线聊天,视频会议等一些基本功能。 Red5的官方网站是http://osflash.org/red5,它目前正处在研发阶段,现在发布的测试版本为0.6.3,它的最终正式版为1.0,red5研发的进程已列在了官方网站上:http://osflash.org/red5/roadmap

    下面介绍几个比较好的学习Red5的网站:

    Openred5中文开源社区: http://www.openred5.cpm/bbs/index.php

    一个red5学习者的博客: http://blog.tianya.cn/blogger/view_blog.asp?BlogName=weitiger

    第五动力: http://www.d5power.com/thread.php?fid=20

    许石南 技术

    关于RED5——如何由RED5的“WIN安装版”建立应用程序

    2009年5月12日

          RED5是一个开源的流媒体服务,我们可以对程序本身进行修改。但是对于一般的开发者来说,不用做这样的修改,只需要建立自己的应用程序就可以了。现在把建立过程记录下来,希望对各位有所帮助。

          本文适合第一次接触RED5(WIN平台下),而不知道如何开始建立自己的应用程序的用户。 流程:

    1.下载最新版本的RED5 http://osflash.org/red5

    2.安装JRE

    3.安装RED5,注意此时会要求指定JRE的目录。

    4.到RED5的安装目录,找到doc/templates目录,该目录中存放了一个标准的RED5应用程序模版myapp,将其复制到RED5安装目录中的webapps目录下,并改名为你喜欢的文件夹名,比如你要开发一个聊天的程序,那么可以把myapp改为myChat,这个名字就是以后你要连接的服务名了。

    5.在WEB-INF中新建一个文件夹src用来存放程序的源代码,新建一个classes文件夹用来存放编译后的文件。

    6.打开Eclipse(若没有请事先安装),将工作区指定为RED5安装目录下webapps,然后新建一个项目,项目名为myChat.这个时候你应该发现刚才myChat中的文件都被加载进来了,我们首先把src目录指定为源代码目录,右键选择src,在弹出的菜单中选择Build Path->Use as Source Folder,即将其指定为代码文件夹。接下来要指定项目的目标目录,在项目名上右键选择Properties,选择Java Bulid Path,在选择Source标签,在下面的Browse中选择Classes目录,将其指定为目标目录。然后选择Libraries,点击Add External JARs,将RED5安装目录下的red5.jar包含进来。

    7.这个时候,在Eclipse的左边应该多了WEB-INF/src这样一个东东,我们将要在这里开始写入我们的第一个项目代码。右键选择它,在弹出的菜单中选择New->Package,新建一个包,举例,包名可以为org.d5.first,然后再在生成的org.d5.first这个包上继续右键选择New->File,输入文件名Application.java。并在建好的文件中输入以下代码:

    package org.d5.first; import org.red5.server.adapter.ApplicationAdapter; public class Application extends ApplicationAdapter { public String login(){ return "Welcome to Chat Servers"; } }

    8.进行配置。 注意:在WEB-INF下一共有四个文件,分别是web.xml,red5-web.xml,red5-web.properties和log4j.properties。我们需要对他们进行修改,关于这四个文件的详细功能,见《关于RED5——配置文件详解》

    在这里,我们需要把web.xml文件作以下更改:找到webAppRootKey,将其下面的param-value标签中的值修改为/myChat。

    把red5-web.xml文件做以下更改:找到bean id=”web.handler”一句,将class=”XXX”中的XXX位置修改为org.d5.first.Application,这样本程序将以刚才写的Application来运行。删除后面的bean id=”server.handler…整句,因为我们暂时用不到这个东东。

    把red5-web.properties文件做以下更改:将第一句修改为webapp.contextPath=/myChat 9.编译项目

    10.重新启动RED5服务器

    11.打开FLASH(若没有请安装,最好安装flash8),新建一个文件,在第一桢输入以下代码:

    nc = new NetConnection(); nc.connect("rtmp://localhost/myChat"); nc.onResult = function(obj){ trace(obj); } nc.call("login",nc); 运行程序,显示结果为Welcome to Chat Servers。

    第一个RED5应用程序诞生了。

    许石南 技术

    关于RED5——配置文件详解

    2009年5月12日

          Red5 是建立在Jetty6(servlet engine) , Mina (networking)基础之上的,并通过使用Spring框架将起整合起来的.因此我们需要有一些配置文件.我们可能的通过载入properties 文件来简化配置,因此用户不需要深入了解XML.该文档就是要新手们去熟悉这些配置文件,其中一些需要改动,一些不必关心.

     

    Jetty Config ———————————-

    一、/conf/jetty.xml

    servlet引擎主配置文件,如果你的应用程序是放在webapps文件中的,你就不需要更改该配置文件.该文件非常象一把瑞士军刀.你可以任意排序.关于其更多的详细信息参见jetty官方相关文档.

    二、/conf/web-default.xml

    缺省的web xml,其在WEB-INF/web.xml之前使用,它使得将servlets添加到所有的应用程序中.可以将其理解为一个webapp的模板文件.

    三、/conf/keystore

    文件存储指纹.

    四、/conf/realm.properties

    web的归属,用户,密码等设置.

     

    Red5 Server配置文件 ———————————-

    一、/conf/red5.properties

    通过修改该文件我们就可以很轻松的指定端口,配置参数等,而不必去编辑xml文件.我们试图将所有的公用配置放到该文件中.

    二、/conf/red5.xml

    连接上下文.不知道是什么意思么?呵呵,不用担心,你不需要编辑该文件,除非你要添加另外一个全局的上下文.你可能在管理Red5的时候才会做这样的事情.

    三、/conf/red5-common.xml

    用来配置上下文环境树的根部,所有的服务都可以用于子环境.如果你想让在全局上下文环境中分享你的服务的话,你就需要修改该文件.99%的用户不需要编辑该文件.

    四、/conf/log4j.properties

    设置日值层,和输出文件等等.该文件作用于整个服务器.除非你要在webapp中的WEB-INF文件夹中使用log4j配置替代该文件,那么你就需要修改该文件.

    五、/conf/red5-net.xml

    安装Mina和启动Jetty.用户不需要修改该文件,类似端口的设置需要通过red5.properties文件配置.

    六、/webapps/red5-default-global.xml

    这是全局的上下文,大部分的服务器只需要一个,但是在安全的管理虚拟主机的时候需要将全局上下文分离.如果你想要在应用程序中分享服务的时候,将其加到这里.该上下文可以操作类似客户端注册和全局作用域.

     

    Webapp配置文件 ———————————-

    在默认的情况下,Red5将所有的应用程序存放在根目录的"Webapps"目录下面.因此在创建一个新的应用程序之前,首先需要在这个目录中创建一个子目录.习惯上这个子目录的名字应该和马上创建的应用程序的名字是一样的. 在你的新应用程序中,需要一个"WEB-INF"的文件夹用来存放关于使用类情况的配置文件.你可以使用Red5提供的一个模板,它可以在"doc/templates/myapp"文件夹中找到.

    在Red5启动的时候,所有文件夹中的配置文件都会搜索到.

    在Red5提供的模板中,WEB-INF下一共有四个配置文件,分别是web.xml,red5-web.xml,red5-web.properties和log4j.properties。下面主要详解一下前两个文件的功能。

    一、Web.xml。

    主要的配置文件,它包含了如下参数:

    1.globalScope: "globalScope"为全局作用域,它可以使用默认的设置. globalScope default

    2.contextConfigLocation 设置应用程序中控制文件的名称.这些控制文件列出了应用程序连接或断开客户端的类,同时也提供客户端可以调用的方法的类.

    控制文件还设定了这些类的有效范围.

    在这个路进中还可以使用通配符,从而可以包含进来多个文件.

    以下代码就是使用了通配符的代码,把WEB-INF/目录下所有文件名前面是“red5-”字样的xml文件包含进来,模板中是把red5-web.xml文件包含了进来。

    contextConfigLocation  /WEB-INF/red5-*.xml

    3.locatorFactorySelector 指定根应用程序上下文配置文件通常是"red5.xml":: locatorFactorySelector red5.xml

    4.parentContextKey 父上下文的名字,通常是"default.context":: parentContextKey default.context

    5.log4jConfigLocation 指定子log系统的路径。模板中其实是把log4j.properties指定为log系统的路径。 log4jConfigLocation /WEB-INF/log4j.properties

    6.webAppRootKey 指定应用程序唯一的名称为/myapp webAppRootKey /myapp

    二、red5-web.xml。

    配置文件,每一个控制配置文件都至少包括如下三种Bean:

    1.Context 这个Context bean有个预留的名字"web.context",它用来将路径放入域中,同时查找服务和控制器。默认的类是"org.red5.server.Context". 具体代码如下: 每个应用程序只能有一个Context。然而这个Context能够跨多个域共享。

    2.域(Scope) 每一个应用程序至少有一个Scope,这个Scope将控制器(Handler)连接到了Context和Server.这个Scopes用来建造一个树结构,客户端能够连接到这个树上的任何一个节点和共享对象(例如共享对象或者实时流).你可以将Scope看作是一个房间或者实例. 默认的Scope通常有个名字"web.scope",但是这个名字可以任意的选择. 这个Bean有如下的属性. "server"—-设置全局的服务器域"red5.server". "parent"—-设置父域,通常是"global.scope". "context"—-指当前域,使用上面提到的"web.context" "handler"—-当前域的控制器(Handler,下面将会提到). "contextPath"—-连接当前域的路径. "virtualHosts"—-用逗号分割开当然域(scope)运行的一组主机名或者IP地址. 例如: 你可以将"contextPath"和"virtualHosts"的值转移到一个单独的properties文件,然后用参数表示.如果是这样的话,你就需要另外的一个Bean:: 假设一个"red5-web.properties"文件包含如下数据:: webapp.contextPath=/myapp webapp.virtualHosts=localhost,127.0.01 那么,在Scope中的参数将会变成如下样子:: 这个"contextPath"将会被看作域的"根(root)".当需要动态创建扩展域的时候,你可以在这个路径后边添加新的元素. 这个额外域将使用同一个控制器(Handler),但是他们都拥有自己独立的属性,共享对象和实时流.

    3.控制器(Handlers) 每一个Context都需要一个控制器(Handler),它实现一个方法,这个方法将在一个客户端连接这个域(Scope)时触发.这个控制器需要实现的接口是:"org.red5.server.api.IScopeHandler",然而如果你想控制访问共享对象或者流,你也可以实现其它接口. 有一个"org.red5.server.adapter.ApplicationAdapter"作为一个基础类可以在类库中找到,这个类就是一个简单实现的例子.更多详细信息请查阅javadoc文档. 这个Bean作为一个域的控制器要进行如下配置:: 这个ID的参数就是上面提到的域(scope)设置.

    4.控制器实例:用下面几行代码实现一个简单的控制器:: package the.path.to.my; import org.red5.server.adapter.ApplicationAdapter; public class Application extends ApplicationAdapter{ public Double add(Double a,Double b){ return a+b; } } 假设已经经过了上面的配置,你可以通过如下的脚本来调用这个方法. nc = new NetConnection(); nc.connect("rtmp://localhost/myapp"); nc.onResult = function(obj){ trace("This result is " +obj); } nc.call("add",nc,1,2); 输出的结果如下: The result is 3; 关于控制器的建立方法,请参考《关于RED5——如何由RED5的“WIN安装版”建立应用程序》一文中的Application.java的建立与编译、执行。

    三、red5-web.properties。

    存放red5-web.xml中参数"contextPath"和"virtualHosts"的文件。该文件可以被red5-web.xml轻松的使用,也会被red5 jetty configurator读取从而设置ebapp.virtualHosts和webapp.contextPath.注意不同的servlet引擎要求的配置文件不同,要酌情决定.

    四、log4j.properties。

    允许你为每个webapp分别设置日志等级等等。该文件也会被spring自动载入。一般不用去修改它,因为在red5的安装目录下的conf文件夹下也有一个相同的文件,该文件已经作用于整个服务器,他的作用是设置了日值层,和输出文件等等。

    许石南 技术

    C++关键字:mutable、volatile、explicit以及__based

    2009年5月4日

    mutable关键字

        关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化!

    如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.这个时候就需要用到mutable关键字了

    阅读全文…

    许石南 技术

    javascript后期绑定的误会

    2009年5月4日

    以前写javascript代码的时候,往往单独一个页面,然后设置N多全局变量.我觉得,作为一家有名气的公司,好歹要有自己的javascript库.于是从自己开始,先从面向对象来着手,考虑一些基础库,然后再继承,再扩展.

    愿望总是美好的.当我今天下了下面的代码的时候:

    阅读全文…

    许石南 技术 ,

    © 2008-2009 cloved.cn, Power By WordPress, Design By sheath, WordPress Themes by mg12.

    Full RSS - Comments RSS - 粤ICP备09006273号

    免责声明:本站所有内容均来源于互联网,若侵犯您的权利,请来信告知,本站会第一时间处理.