一、开发交互式的媒体应用程序

1.使用unique key

a. 在客户端ActionScript中创建一个unique key,如下代码所示,unique key的组成为本地电脑时间和一个随机数连接起来的字符串.

var keyDate = String(new Date().getTime());

var keyNum = String(Math.random());

var uniqueKey = keyDate+keyNum;

b. 在连接请求中将这个unique key发送给服务器

nc.connect("rtmp://www.example.com/someApplication", uniqueKey);

c. 下面的在main.asc文件中的代码在连接请求中寻找这个unique key.假如key丢失了或者已经被使用,连接会被服务器拒绝.

clientKeyList = new Object();   // holds the list of clients by key

application.onConnect = function( pClient, uniqueKey ) {
    if ( uniqueKey != undefined ) {    // require a unique key with connection request
        if ( clientKeyList[uniqueKey] == undefined ) {   // first time -- allow connection
            pClient.uniqueKey = uniqueKey;
            clientKeyList[uniqueKey] = pClient;
            this.acceptConnection(pClient);
        } else {
            trace( "Connection rejected" );
            this.rejectConnection(pClient);
        }
    }
}

application.onDisconnect = function( pClient ) {
    delete clientKeyList[pClient.uniqueKey];
}

2.使用Access Plugin

3.使用FlashPlayer版本

    你可以保护你的内容不被运行在非FlashPlayer的客户端访问,以从服务端得到的user agent string为基础. user agent string能够识别客户端平台和FlashPlayer的版本.例如

WIN 8,0,0,0
    MAC 9,0,45,0

两种方法获得这些字符串:

Virtual keys 参考Multiple bit rate switching andVirtualKeys.

Client.agent 通过服务端ActionScript验证连接

application.onConnect = function( pClient ) {
    var platform     = pClient.agent.split(" ");
    var versionMajor = platform[1].split(",")[0];
    var versionMinor = platform[1].split(",")[1];
    var versionBuild = platform[1].split(",")[2];
}

// output example
// Client.agent: WIN 9,0,45,0
// platform[0]:   "WIN"
// versionMajor: 9
// versionMinor: 0
// versionBuild: 45

4.核实连接的SWF文件

你可以配置服务端以在客户端连接上服务端应用之前证实客户端的真实性.核实SWF文件以防止有些人创建他们自己的SWF文件来访问你的资源,Flash Player 9 Update 3以上版本支持SWF核实功能.参见:ConConfiguration and Administration Guide. 一章

5.允许或者拒绝来自特定域的连接

假如你知道某个域的连接是合法的,你就可以将他们添加到白名单.相反的,你可以将那些非法域假如黑名单

你可以在Adaptor.xml文件中加入一个包含域名的静态列表.参见Adobe Flash Media Server Configuration and Administration Guide.

你也可以把这些列表保存在服务端代码和文件中.在下面的例子中,一个文件名为bannedIPList.txt的文件包含了一个排除IP地址的列表.

// bannedIPList.txt file contents:
// 192.168.0.1
// 128.493.33.0

function getBannedIPList() {
    var bannedIPFile = new File ("bannedIPList.txt") ;
    bannedIPFile.open("text","read");
   
    application.bannedIPList = bannedIPFile.readAll();
   
    bannedIPFile.close();
    delete bannedIPFile;
}

application.onConnect = function(pClient) {
    var isIPOK = true;
    getBannedIPList();
    for (var index=0; index<this.bannedIPList.length; index++) {
        var currentIP = this.bannedIPList[index];
        if (pClient.ip == currentIP) {
            isIPOK = false;
            trace("ip was rejected");
            break;
        }
    }
   
    if (isIPOK) {
        this.acceptConnection(pClient);
    } else {
        this.rejectConnection(pClient);
    }
}

另外,你可以创建服务端代码来检测来自特定域的请求是否太快:

application.VERIFY_TIMEOUT_VALUE = 2000;

Client.prototype.verifyTimeOut = function() {
    trace (">>>> Closing Connection")
    clearInterval(this.$verifyTimeOut);
    application.disconnect(this);
}

function VerifyClientHandler(pClient) {
    this.onResult = function (pClientRet) {
        // if the client returns the correct key, then clear timer
        if (pClientRet.key == pClient.verifyKey.key) {
            trace("Connection Passed");
            clearInterval(pClient.$verifyTimeOut);
        }
    }
}

application.onConnect = function(pClient) {
    this.acceptConnection(pClient);

// create a random key and package within an Object
    pClient.verifyKey = ({key: Math.random()});
   
    // send the key to the client
    pClient.call("verifyClient",
        new VerifyClientHandler(pClient),
        pClient.verifyKey);

// set a wait timer
    pClient.$verifyTimeOut = setInterval(pClient,
                                      $verifyTimeOut,
                                      this.VERIFY_TIMEOUT_VALUE,
                                      pClient);
}

application.onDisconnect = function(pClient) {
    clearInterval(pClient.$verifyTimeOut);
}
以上这段代码的具体意思有待考证....

[转载]FMS Dev Guide学习笔记(验证客户端二)的更多相关文章

  1. [转载]FMS Dev Guide学习笔记(验证用户)

    一.开发交互式的媒体应用程序 1.使用外部资源验证用户 对于有限数量的客户,请求用户名密码,然后通过外部资源(像数据库.LDAP服务或其它访问授权服务)验证它们,是可行的.     a.SWF在请求连 ...

  2. FMS Dev Guide学习笔记(验证客户端)

    一.开发交互式的媒体应用程序 1.使用客户端对象的属性     当一个客户端连接上服务器上的一个应用,服务端就会创建一个包含这个客户端信息的客户端对象并且将它传递给application.onConn ...

  3. FMS Dev Guide学习笔记

    翻译一下其中或许对游戏开发有用的一个章节 一.开发交互式的媒体应用程序 1.共享对象(Shared objects)     ----关于共享对象     使用共享对象可以同步用户和存储数据.共享对象 ...

  4. FMS Dev Guide学习笔记(远程共享对象)

    一.开发交互式的媒体应用程序1.共享对象(Shared objects)    ----远程共享对象 在你创建一个远程共享对象之前,创建一个NetConnection对象并且连接到服务器.一旦你创建了 ...

  5. FMS Dev Guide学习笔记(SharedBall)

    一.开发交互式的媒体应用程序1.共享对象(Shared objects) ----SharedBall example 这个SharedBall example创建了一个临时的远程共享对象.类似于多人 ...

  6. FMS Dev Guide学习笔记(权限控制)

    一.开发交互式的媒体应用程序 1.关于访问(权限)控制     当一个用户访问服务器的时候,默认情况下,他可以访问所有的流媒体文件和共享对象.但是你可以使用服务端ActionScript为流媒体文件和 ...

  7. Mina框架的学习笔记——Android客户端的实现

    Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络 ...

  8. 【Unity Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型

    [Unity Shaders]学习笔记——SurfaceShader(二)两个结构体和CG类型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5596698. ...

  9. 【转】 Pro Android学习笔记(九二):AsyncTask(1):AsyncTask类

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在Handler的学习系列中,学习了如何h ...

随机推荐

  1. 数组.html

    <script > var arr1 = [1, 2, 3, 4, 5, 6 ]; 赋值 var arr2 =Array(1,2,3,4,5,6); var arr3 = new Arra ...

  2. Navicat Premium 将sqlserver 数据库 导入mysql 中

    1.新建 MySQL 数据库  2.  3 4 5 6 7 8 9一直点击下一步 10 成功

  3. Hbase访问方式

    Hbase访问方式 Hbase shell命令操作 Hbase shell命令操作--general操作 首先启动Hbase 启动shell 查看表结构 删除一个表 创建表和查看表结构 插入几条数据 ...

  4. js中基本数据类型和引用数据类型的区别

    1.基本数据类型和引用数据类型 ECMAScript包括两个不同类型的值:基本数据类型和引用数据类型. 基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象. 当我们把变量赋值给一个变 ...

  5. Java - 23 Java 抽象类

    Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不 ...

  6. SQL SERVER 数据压缩

    从SQL SERVER 2008开始,SQL SERVER 提供了对数据进行压缩的功能,启用数据压缩无须修改应用程序. 数据压缩可有效减少数据的占用空间,读取和写入相同数据花费的IO也响应减少,从而可 ...

  7. springmvc接收前台(如ajax)传来的数组list,set等图文详解

        ref:https://blog.csdn.net/wabiaozia/article/details/50803581 前言: 相信很人都被springmvc接收数组问题折磨过,查过几个解决 ...

  8. python连接数据库——create_engine和conn.cursor

    python操作数据库的方法: 一种是导入sqlalchemy包,另一种是导入psycopg2包. 具体用法如下(此处以postgre数据库举例) 第一种: # 导入包 from sqlalchemy ...

  9. cdlinux写入u盘启动的制作教程

    制作方法如下:(摘自于https://blog.csdn.net/suquan629/article/details/52996792) 1.所需要的工具软件: cdlinux0.9.7.isoUlt ...

  10. super的使用方法与使用范围

    如果你了解,用this是调用一个类里面的变量或者对象方法.那么super你可以理解为调用多态或者继承类中的构造方法和对象方法.在super调用构造方法时,只能调用带参的构造方法,这也是唯一调用其他类里 ...