记录ricelane的编程人生

我的最新日志

  • RTMP协议概述

    2008-5-06

    原文出处 http://www.openred5.com/bbs/viewthread.php?tid=188&extra=page%3D1

    RTMP协议概述

    介绍:

    RTMP协议是被Flash用于对象,视频,音频的传输.该协议建立在TCP协议或者轮询HTTP协议之上.
    RTMP协议就像一个用来装数据包的容器,这些数据可以是AMF格式的数据,也可以是FLV中的视/音频数据.
    一个单一的连接可以通过不同的通道传输多路网络流.这些通道中的包都是按照固定大小的包传输的.

    网络连接(Connection)

    一个Actionscrīpt连接并播放一个流的简单代码:
    CODE:
    var videoInstance:Video = your_video_instance;
    var nc:NetConnection = new NetConnection();
    var connected:Boolean = nc.connect("rtmp:/localhost/myapp");
    var ns:NetStream = new NetStream(nc);
    videoInstance.attachVideo(ns);
    ns.play("flvName");


    默认端口为1935

    握手

    Client → Server :向服务器发出握手请求.这不属于协议包一部分,该握手请求第一个字节为(0×03),其后跟着1536个字节.经管看上去这部分的内容对于RTMP协议来说并不是至关重要的,但也不可随意对待.
    Server → Client :服务器向客户端回应握手请求.这部分的数据仍然不属于RTMP协议的部分.该回应的其实字节仍然为(0x03),但是后边跟着个长度为1536个字节(一共为3072 )的包块.第一个1536块看上去似乎可以是任意内容,甚至好像可以是Null都没有关系.第二个1536的代码块,是上一步客户端向服务器端发送的握手请求的内容.
    Client→Server:把上一步服务器向客户端回应的第二块1536个字节的数据块.

    至此客户端与服务器端的握手结束,下面将发送RTMP协议的包内容.

    Client → Server :向服务器发送连接包.
    Server → Client :服务器回应.
    ... .... 等等... ...

    RTMP 数据类型

    0×01 Chunk Size changes the chunk size for packets
    0×02 Unknown anyone know this one?
    0×03 Bytes Read send every x bytes read by both sides
    0×04 Ping ping is a stream control message, has subtypes
    0×05 Server BW the servers downstream bw
    0×06 Client BW the clients upstream bw
    0×07 Unknown anyone know this one?
    0×08 Audio Data packet containing audio
    0×09 Video Data packet containing video data
    0x0A - 0×11 Unknown anyone know?
    0×12 Notify an invoke which does not expect a reply
    0×13 Shared Object has subtypes
    0×14 Invoke like remoting call, used for stream actions too.

    Shared Object 数据类型

    0×01 Connect
    0×02 Disconnect
    0×03 Set Attribute
    0×04 Update Data
    0×05 Update Attribute
    0×06 Send Message
    0×07 Status
    0×08 Clear Data
    0×09 Delete Data
    0x0A Delete Attribute
    0x0B            
    Initial Data

    RTMP包结构

    RTMP包 包含一个固定长度的包头和一个最长为128字节的包体.包头可以是下面4种长度的任意一种:12, 8, 4, or 1 byte(s).
    第一个字节的前两个Bit很重要,它决定了包头的长度.它可以用掩码0xC0进行"与"计算.下面的表格罗列了可能的包头长度:
    Bits Header Length
    00 12 bytes
    01 8 bytes
    10 4 bytes
    11 1 byte
    我们在这里讨论关RTMP包结构的问题并不是非常的详细.我们在以后有时间会讨论关于AMF的问题(敬请期待...),其实RTMP包结构就是使用了AMF格式.



    关于流的操作我们需要进一步研究,在论坛中的http://www.openred5.com/bbs/viewthread.php?tid=175&extra=page%3D1这篇文章研究的还是不错的,大家可以参考.不过下面可以列一个关于客户端向服务器端发送流的流程:

    Client→Server :发送一个创建流的请求.
    Server→Client :返回一个表示流的索引号.
    Client→Server :开始发送.
    Client→Server :发送视音频数据包(这些包在同一个频道(channel)并用流的索引号来唯一标识).

    今天配置FLex环境时,出现了这样一个问题,所以搜到这篇文章的。

    [Flex] RTMP-Server on port: 2038 failed to start up.
    java.net.BindException: Address already in use: bind
            at sun.nio.ch.Net.bind(Native Method)
            at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:
    119)
            at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
            at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:52)
            at flex.messaging.endpoints.rtmp.BaseNIORTMPServer.run(BaseNIORTMPServer
    .java:155)
            at java.lang.Thread.run(Thread.java:595)

    Exception in thread "RTMP-Server" flex.messaging.endpoints.rtmp.RTMPException: T
    he RTMP server has encountered a fatal exception starting up: Address already in
     use: bind
            at flex.messaging.endpoints.rtmp.BaseNIORTMPServer.run(BaseNIORTMPServer
    .java:317)
            at java.lang.Thread.run(Thread.java:595)
    Caused by: java.net.BindException: Address already in use: bind
            at sun.nio.ch.Net.bind(Native Method)
            at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:
    119)
            at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:59)
            at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:52)
            at flex.messaging.endpoints.rtmp.BaseNIORTMPServer.run(BaseNIORTMPServer
    .java:155)
            ... 1 more

     

     

  • 自己写的第一个Flex程序

    2008-4-24

    <?xml version="1.0" encoding="utf-8"?><mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" verticalAlign="middle" backgroundColor="white">
    <mx:WipeDown id="wipeOut"  duration="1000"/>
    <mx:scrīpt>   
     <![CDATA[         
     private function test():void{             
      var cars:Array = new Array(2);
      cars[0]=[1500,1];
      cars[1]=[1200,2];
      var price:Number = cars[0][0]*cars[0][1] +  cars[1][0]*cars[1][1];
      content.text=price.toString();   
     }   
     ]]>
    </mx:scrīpt>
    <mx:Button x="287" y="235" label="测试" click="test();"/>
    <mx:TextArea id="content" />
    </mx:Application>
  • 如何设置Weblogic以提高并发处理性能

    2007-12-04

    1.      设置Weblogic线程数

    Thread Count 改为一个较大的值,如 100

    2.      设置Weblogic JDBC 缓冲池

    3.      关闭Weblogic服务器

    4.      修改 startWeblogic.cmd 文件

    打开 {mydomain}\startWebLogic.cmd,找到下面的行:

     

    @rem Set MEM_ARGS to the memory args you want to pass to java.  For instance:

    @rem set MEM_ARGS=-Xms32m -Xmx200m

    set MEM_ARGS=

     

    改为:

    @rem Set MEM_ARGS to the memory args you want to pass to java.  For instance:

    @rem set MEM_ARGS=-Xms32m -Xmx200m

    set MEM_ARGS=-Xms1024m -Xmx1024m -XX:MaxPermSize=128m -XX:MaxNewSize=384m -XX:NewSize=384m -XX:ThreadStackSize=4m

    注意第3行是一行,中间没有换行,这里因为显示不下才变成了两行。

    5.      重新启动Weblogic服务

     

     

  • 如何删除Oracle

    2007-12-04

    1.停止所有的Oracle服务;

    2.卸载所有的Oracle产品;

    3.在注册表中进行删除下列项目:
     a.HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
     b.HKEY_LOCAL_MACHINE\SYSTEM\CURRENTCONTROLSET\SERVICES,删除所有Oracle入口
     c.HKEY_LOCAL_MACHINE\SYSTEM\CURRENTCONTROLSET\SERVICES\EVENTLOG\APPLICATION,
       删除所有Oracle入口

    4.删除环境变量中classpath和path中有关Oracle设定;

    5.删除操作系统盘中:Programs\Files\Oracle 目录;

    6.删除Oracle的所在目录;

    7.在Win2000中,删除C:\winnt中的Oracle.int,Oraclim73.ini,Oradim80.ini,Oraodbc.ini;

    8.将win.ini中的[oracle]标记字段删除;

    9.删除与Oracle 相关ODBC的DSN;

    10.删除Oracle相关日志;

    注:如果安装时出现"symcjit not found" 错误(通信通道的文件结束)
     则可通过将安装程序中的symcjit.ini 修改为symcjit.old来解决。

  • 性能调优及UNIX操作(接上篇)

    2007-6-29

          units:试用版weblogic软件,这个值为5,也就是说,最多允许5各用户访问这个weblogic服务。unlimited表明没有限制。

    WebLogic性能优化——NativeIO

          weblogicserver中,一般要将Enable Native IO”选项置为false,即未选中状态。并将Socket Readers”的值设大668899等,缺省值为33

     

          还要查看各线程的状态,如果线程出现大量被Socket Readers”请求占用的情况,则还是要将NativeIO置为true

     

    Unix日常命令操作

          telnet 登录到远程服务器

     

          pwd 查看当前所在的路径(目录)

       [root@linux2 ~]# pwd

       /root

          ls 显示路径下的文件

        -l  显示文件的属性

        -a 显示隐含文件

    Unix日常命令操作

           drwx------   2 root root  4096  5 15 08:17 .gnome2_private

           drwxr-xr-x   2 root root  4096  5 15 07:48 .gstreamer-0.8

           -rw-r--r--   1 root root   120 2005-08-06  .gtkrc

           -rw-r--r--   1 root root   130  5 15 08:17 .gtkrc-1.2-gnome2

           -rw-------   1 root root   915  6 12 14:23 .ICEauthority

           -rw-r--r--   1 root root 49804  5 15 08:10 install.log

           -rw-r--r--   1 root root 32468  5 15 08:10 install.log.syslog

           drwx------   3 root root  4096  6  7 08:41 .kde

     

          注意文件属性为第一行信息-rw-r--r—

     

          d目录,-普通文件,l链接

          文件主、同组用户、其他用户对文件的权力

     

    Unix日常命令操作

          cd 进入目录

     

          mkdir 建立目录

     

          rmdir 删除目录

     

          more 显示文件

    Unix日常命令操作

          cp 拷贝文件

     

          rm 删除文件

     

          chmod 改变文件属性

     

          diff 比较两个文件

    Unix日常命令操作

          ps 查看进程

     

          kill 中止进程

     

          vi 编辑文件

  • 性能调优及UNIX操作

    2007-6-29

     

    主要内容

          1WebLogic服务的监控

     

          2WebLogic性能优化

     

          3UNIX操作命令介绍

    WebLogic服务的监控

          WebLogic的控制台console对内存的监控

     

     

          Console  -->  server  -->   myserver   -->    右边窗口Mornitoring  -->  Performance

     

     

     

    WebLogic服务的监控

          Idle Threads 空闲线程数

           这个值不能为0,否则意味着系统无线程可用,有死机的危险.

     

          Queue Length 等待队列的长度

           Idle Threads的值为0时,Queue Length会出现数值。如果Queue Length维持在较高位置,且不下降时,有死机危险。但只要值在变,就说明系统还在运行.

     

    WebLogic服务的监控

          Memory Usage 内存的使用情况

           主要看垃圾回收是否频繁,在系统高负载的情况下,内存是否能达到8090%的使用率。

     

    WebLogic服务的监控

          查看线程的运行情况

           线程是否都为空闲null状态。如不为空闲,看看是什么样的请求在占用线程。

     

    Console  -->  server  -->   myserver    -->    右键菜单View Execute Threads

     

    如下图所示:

     

    WebLogic服务的监控

          Current Request 当前线程正在处理的请求

     

          被占用的线程的情况:464849

           占用内容:Socket Reader Request

     

     

    WebLogic性能优化——内存

        一般建议正式的域(Domain)设置为-Xms1024m -Xmx1024m,表示堆的初始大小和最大值都是1024M

     

        1、修改文件:UnixstartWebLogic.shstartManagedWebLogic.sh(集群用);Windows系统为startWebLogic.cmdstartManagedWebLogic.cmd(集群用)。

     

          2、修改位置:为保证我们修改的参数生效,最好将内存参数命令行放在启动Java虚拟机之前。示例如下:

    WebLogic性能优化——内存

           export CLASSPATH

           MEM_ARGS="-Xms1024m -Xmx1024m -XX:NewSize=256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m"

           # Call WebLogic Server

           echo "."

           echo "CLASSPATH=${CLASSPATH}"

           echo "."

           echo "PATH=${PATH}"

           echo "."

           echo "***************************************************"

           echo "*  To start WebLogic Server, use a username and   *"

           echo "*  password assigned to an admin-level user.  For *"

           echo "*  server administration, use the WebLogic Server *"

           echo "*  console at http://[hostname]:[port]/console    *"

           echo "***************************************************"

           ${JAVA_HOME}/bin/java ${JAVA_VM} ${MEM_ARGS} ${JAVA_OPTIONS} -Dweblogic.Name=${SERVER_NAME} -Dweblogic.ProductionModeEnabled=${PRODUCTION_MODE} -Djava.security.policy="${WL_HOME}/server/lib/weblogic.policy" weblogic.Server

    WebLogic性能优化——内存

          3、注意UnixWindows的参数差别。AIXLinux的参数值要加上双引号,Windows则不需要加。如该加的没加,不该加的加了,就会导致设置的参数不起作用,影响应用系统的性能。

     

          4Unix系统下参数是否生效的检查。可以使用如下命令:

        ps –ef|grep java

        如果设置的参数生效,在显示的结果中会看到设置的值。如没有生效,会显示weblogic缺省的值-Xms32m –Xmx200m

    WebLogic性能优化——内存

          5Windows下可以使用echo命令,在startWebLogic.cmd文件中查看

        echo %MEM_ARGS%

        会在dos窗口中输出内存设置的信息。

     

     

    WebLogic性能优化——线程数

          线程数Thread Count

           weblogic服务在接收到请求后,会交给后台的线程来处理,线程数决定了并发处理能力的大小。

            一般以服务器的CPU个数为基准,每个CPU可负担25个线程,最好不要超过50

     

          查看线程的运行情况,上面已经提到。

    WebLogic性能优化——线程数

          更改线程数Thread Count

           server  ——>  右键菜单  ——>  “View Execute Queues”项查看,如下图:

           

     

     

    点击default”,进入修改页面:

    WebLogic性能优化——线程数

          修改了thread count的值后,要点击应用(Apply按钮,并重启服务后,参数才能生效。

    WebLogic性能优化——连接池

          数据库连接池的初始连接数建议200或以上,如资源允许可设置得更大,但不能操作最大连接数,最大连接数设置800

     

          Oracle的参数processes设置为1000或以上。

     

          查看连接池:console>services >Connection Pools

     

    修改参数

    WebLogic性能优化——License

                 Weblogic实行License许可制度,免费下载软件使用的license是受限制的,各个方面都会受到限制。

     

                 license文件的文件名为license.bea,位于weblogic的安装根目录下。

     

                 文件如下:

    WebLogic性能优化——License

           <bea-licenses>

               <license-group format="1.0" product="WebLogic Platform" release="8.1">

                   <license

                       component="2PC"

                       cpus="unlimited"

                       expiration="never"

                       ip="any"

                       licensee="BEA Commercial Customer"

                       type="Commercial"

                       units="unlimited"

                       signature="zHCClaqBLPISe/tJfo8vPBecDtE=0MCwCFCMCc6O2WuIwtrJyR7i2IkivYYfhbug=="

                   />

    WebLogic性能优化——License

          主要检查4项:cpuexpiratioinipunits

     

          cpu:支持服务器使用cpu的数量,一般来说服务器都是多cpu的,如果这个值为12,等固定的数值,会限制服务器性能的发挥。unlimited表明没有限制,是最好的。

     

          expiration:表明license文件的使用期限,如果是固定的日期,那么过了此日期,weblogic就不能使用了。而且license文件的内容是不能修改的,不能通过修改此值的方式实现继续使用的目的。never</