最小化数据传输——在客户端存储数据

客户端|数据

将程序输出为其他的语言是程序员喜爱的事情之一,在WEB上我们有
两个不同编程环境:客户端(浏览器)和服务器端,根据HTTP协议的定义,
我们可以在编写在客户端输出其他语言的服务端程序,我们选择了作为服
务端语言、javascript作为客户端输出。在本问中我们将向您演示这样用
该方案把数据存储在客户端,并且在诸如:聊天室、新闻系统或其他您想
实现的应用上达到服务端和客户端(浏览器)的最小的数据传输。

要求以下支持:
    PHP4
    JavaScript
    Frames

主要思想:
     
    我们一直试图用PHP开发一个基于HTTP协议的聊天室(HTTP CHAT ROOM),
尽管对聊天来说HTTP协议并不是个好协议,但是它可以不受防火墙或代理影响,
PHP完全可以实现该功能而不必使用JAVA APPLETS,对于聊天室主要有两个问题:
第一、由于IE 不支持SERVER PUSH 技术,所以我们只有用CLIENT PULL技术(既
客户端自动刷新),第二个问题就更深一层了:因为该思想是在客户端刷新,所以服
务端每次必须传送所有的消息,这意味着大量的数据传输,这也正是聊天室延迟的主
要原因,本文试图解决该问题:
   使用框架技术(frames) 你能够刷新指定页面,而不必重新装载别的页面,这可
以减少服务/客户端(C/S)数据传输量。我们的模型就是基于该方案。
    "master"文件:定义框架结构
    "loader"页面:导入数据
    "display"页面:显示数据
    在该方案,"loder"框每"x"秒自动刷新一次——我们的思想是把数据存储在"master"
文件内,这样"loder"页面只要向服务端请求客户端所没有的数据就可以了我们使用时间戳标(timestamp)
记每个消息来决定那些消息必须传给客户端那些不必传输。我们使用PHP4。0的会话管理(session)
存储客户端的最后更新的时间戳(last timestamp)以使时间戳对服务端和客户端均可见。当"loader"文件
从"master"文件收到数据(注意:"master"文件很大,但是它只传送一次)时,就刷新显示页("diaplay")
而"display"页只是简单的调用"master"文件的名为"displaymsgs()"的javascript 函数显示消息。该函数动态显示
存储在"master"文件的数据,以下是大体流程图:
    1。浏览器请求"master"页(框架),"master"页从服务器端传送到客户端(浏览器),然后"master"
    文件生成框架,并且将"loader"和"display"页调到客户端。
    2。在服务端,"loader" 文件将分析:如果客户端没定义"timestamp" session 变量,"loder"文件将
    从服务端得到所有数据,并生成javascript代码将数据存入"master"文件,然后将"timestamp"变量存为
    session 变量。
    3。"loder"页面生成javascript 代码刷新 "display"页面。
    4。刷新请求使得"display"页面调用"diaplaymsgs()"javascript 函数显示数据
    5。每隔"x" 秒回到步骤2

我们可以该思想如下:
    ========================================================
    "master"文件:非常大,定义了displaymsgs() 函数和存储数据和初始值。
    "loader"文件:小,从服务端取回数据,生成javascript 代码
    "display"文件:非常小,调用"master"文件的"diaplaymsgs()"函数
    =========================================================
    注:“master"文件只传送一次
        "loder" 和 "display" 文件每隔"x"秒刷新一次
        第一次传送的时候"loder"可能会很大,但以后就会很小
        "diaplay"文件一直不变

如果您对以上的思路还是不太清楚的话,以下我们将建立一个聊天室具体讲解该方法,这个聊天室只是为了简单的演示
所以可能并不是很有用,但是您完全可以使用该思想建立更复杂的聊天室,记住这个思想并不是只用与聊天室 。:)

    首先请您使用mysql数据库表单:
        ============================
        create table testeable (
              timestamp datetime,
              message    text
        );
        ============================
    "master"文件如下:
        ================================================
        <script>
            lines=new Array();
            function displaymsgs() {     
              for(i=0;i<lines.length;i++) {
                 display.document.write(lines[i]);
                 display.document.write('<BR>');
                  }
            }
        </script>
        <frameset cols="1" rows="20,60,20" border="0">
        <frame name="loader" src="loader.php">
        <frame name="display" src="display.php">
        <frame name="form" src="form.php">
        </frameset>
        ==================================================
        注:"form"文件是发言框,提供用户输入发言框。

        "display"文件内容:
        =====================
        <script>
        top.displaymsgs();
        </script>
        ====================
        "display"文件是不是很小? :)
         
        "loader"文件:
        ====================
        <?php  

        session_start(); // 在这使用 Sessions !  

        if(!isset($timestamp)) {  
            //如果"timestamp"没有定义,则定义并设为0  
            $timestamp=0;      
        }  

        $dab=mysql_connect("localhost","user","password");  // 打开数据库
        mysql_select_db("testbase",$dab);  

        // 查找客户端所没有的信息  
        $query="select * from testeable where timestamp>'$timestamp'";  
        $result=mysql_query($query,$dab);  
        $msgs=array();  

        // 在这个循环,我们存储最新消息/数据,并设置"timestamp"为当前最大值
         
        while($res=mysql_fetch_array($result)) {  
            $msgs[]=$res["message"];  
            if($res["timestamp"]>$timestamp) {  
                $timestamp=$res["timestamp"];  
            }  
        }  
        session_register("timestamp"); // 注册"timestamp"变量

        echo '<script>';  

        // 在这个循环我们生成javascript代码
        // 把最新从服务端得到的数据存储到"master"页面里(注意:使用"top"指向最顶窗口(master)
         
        for($i=0;$i<$count($msgs);$i++) {  
            ?>  
            top.lines[top.lines.length]="<?php print("$msgs[$i]"); ?>";  
            <?php  
        }   

        //现在我们将生成"javascript"代码 ,使 "display"页刷新

        ?>  
        top.display.location.reload();  
        </script>  

        <!-- 注意是用 javascript 的"setInterval()" 方法使得"loader"页面每隔4秒刷新一次  -->  
        <body onLoad="window.setInterval('location.reload()',4000);">  
        </body>  
        =======================================
         
        "form"页面:
        ====================
        <?php  

        session_start();  

        if (!isset($timestamp)) {  
              $timestamp=0;  
        }  

        // 显示表单,产生"timestamp"变量.  
        if (isset($msg)) {  
                $dab=mysql_connect("localhost","root","seldon");  
                mysql_select_db("testbase",$dab);  
               $query="insert into testeable(timestamp,message) values(now(),'$msg')";  
               mysql_query($query,$dab);  
               // 得到timestamp 后的所有消息
                $query="select * from testeable where timestamp>'$tt'";  
               $result=mysql_query($query,$dab);  
               $msgs=array();$i=0;$timestamp=0;  
                while($res=mysql_fetch_array($result)) {  
                    $msgs[]=$res["message"];  
                    if($res["timestamp"]>$timestamp) {  
                            $tt=$res["timestamp"];  
                    }  
                }  
                session_register("timestamp");  
                 
            ?>  
              <script>  
              <?php  
                 for($i=0;$i<$count($msgs);$i++) {  
            ?>  
                top.lines[top.lines.length]="<?print("$msgs[$i]");?>";  
            <?php  
             }  
              ?>  
            top.display.location.reload(); //刷新"display"页
              </script>  
        <?php  
    }  
    ?>  
    <form name="foo" action="<?php print("$PHP_SELF"); ?>" method="post">  
    Message:<input type="text" name="msg">  
    <input type="submit" name="newmsg" value="send">  
    </form>  
    =====================================================
    注:我们使得在"form"页提交发言时,马上刷新"display"页面,这可以达到对发言人来说马上发言马上
    显示,更体现实时性。
     
   正如您所看到的,这个聊天室很简单,这就是最小化客户/服务(C/S)数据传输技能,使用这个技术您可以达到最
   小的数据传输,再次提醒您:该技术并不是这用于聊天室!
=======================================================
以上在win98+apache1.3+php4.03平台测试通过!

时间: 2025-01-01 17:46:54

最小化数据传输——在客户端存储数据的相关文章

最小化数据传输——在客户端存储数据_php基础

将程序输出为其他的语言是程序员喜爱的事情之一,在WEB上我们有 两个不同编程环境:客户端(浏览器)和服务器端,根据HTTP协议的定义, 我们可以在编写在客户端输出其他语言的服务端程序,我们选择了作为服 务端语言.javascript作为客户端输出.在本问中我们将向您演示这样用 该方案把数据存储在客户端,并且在诸如:聊天室.新闻系统或其他您想 实现的应用上达到服务端和客户端(浏览器)的最小的数据传输. 要求以下支持:     PHP4     JavaScript     Frames 主要思想:

Ascend值得期待:能够最小化数据传输时的被窃机会

公有云的环境下,数据加密成为保障数据安全的一大关键手段.但是当一个芯片需要发送或者接收芯片以外的存储数据时,将会给需要获悉工作负载.明确攻击目标的攻击者们带去可乘之机. 在7月2日的麻省理工学院新闻发布上,研究员们带来了名为Ascend的系统,该系统可以解决涉及内存访问上的安全缺陷. Ascend通过一系列的措施来最小化攻击者从内存数据传输过程中获得信息的可能性,它发明了一个查询内存地址的新途径: Devadas与他的研究生Ling Ren.Xiangyao Yu.Chistopher Flet

c# richtextbox 在窗口最小化后,最大化后数据不显示

问题描述 看上图,c#写的Activex控件,继承子userContrl类.在1图上赋值后都能显示,但是我把窗口最小化,在最大化后richtextbox数据就不显示了,需要用鼠标在里面选中才能显示数据.还有我把窗口左移出桌面也是相同状况,我重写了一下onPaint()函数就可以了protectedoverridevoidOnPaint(PaintEventArgse){this.richTextBox1.Invalidate();base.OnPaint(e);}但是现在最小化,在最大化还是不行

海量文件基于NAS存储数据异地容灾难诀窍

   数据存储是门大学问,比如用户的关键业务数据存储,通常是在大型数据库的基础上进行存储与管理,其相应的数据存储形式主要是数据块(Block),中小型数据库则可能会采用文件形式(file). 但是作为办公自动化OA.卷宗类海量内部文档管理.多集群前端业务平台.互联网业务平台.财务系统.工资系统等需要文件级(file)的集中存储与共享时,则有更专业的需求:一是充分利用现有的网络资源;二是提供强劲的存储容量的扩展;三是多台服务器对海量文件级的数据读写;四是降低存储资源开销及整体拥有的成本. 如何解决

web 前端-html中用无序列表制作菜单,最小化网页出现的问题

问题描述 html中用无序列表制作菜单,最小化网页出现的问题 我使用无序列表做的网页菜单.为什么最大化时好好的,当我收缩的时候,列表就乱了.请大神回答下.谢谢,新手想不出来,有图: 代码如下: @charset "utf-8"; /* CSS Document */ #whole{ text-align:center;} #head{ background-color:#000; height:536px; } #titlebar{ background-color:#000; hei

安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五)

安装完最小化 RHEL/CentOS 7 后需要做的 30 件事情(五) 25. 安装 Linux Malware Detect (LMD) Linux Malware Detect (LMD) 是 GNU GPLv2 协议下发布的开源 Linux 恶意程序扫描器,它是特别为面临威胁的主机环境所设计的.LMD 完整的安装.配置以及使用方法可以查看: 安装 LMD 并和 ClamAV 一起使用作为反病毒引擎 26. 用 Speedtest-cli 测试服务器带宽 speedtest-cli 是用

数据存储技术取得突破,存储数据需“开源”更需“节流”

日前,IBM研究团队成功地通过"孤立原子"(solitary atom)的方式创造出了全世界最小的磁体.具体的思路是,现有的数据存储技术及硬盘在存储数据时,大多需通过磁头磁化磁层上的介质,每存储1bit数据大约需要10万粒原子,而IBM通过"孤立原子"的方式,使数据存储的硬盘体积缩小了1000倍. 对此,该团队在<自然>(Nature)杂志上发文称,这一突破将为人类带来令人兴奋的全新数据存储系统. 如今,移动计算和云计算飞速发展,全球数据量随之猛增.数据

OpenStack更新:最小化风险和停机时间

为了使OpenStack部署更平稳安全运行,更新和打补丁是非常关键的工作.但是要执行这些更新任务,IT团队要投入的时间精力远不只是按按开关就可以的. OpenStack平台由大约30个不同的模块组成,其中每个模块都有着相当复杂的功能和要求.OpenStack的开发团队也是基于开源的,这有可能导致不平衡的测试.文档和代码质量. 这就要求IT团队必须定期执行OpenStack更新以避免影响系统运行的稳定性.在很多方面,那就如同是维护一个操作系统(如Windows)一样,需要将bug修复更新保持至最新

IDF2013:贯穿客户端和数据中心的全新体验

英特尔信息技术峰会,北京,2013年4月10日--在今天于北京举行的2013年英特尔信息技术峰会上,英特尔公司高级副总裁兼数据中心及互联系统事业部总经理柏安娜(Diane Bryant)介绍了英特尔如何利用贯穿客户端和数据中心的创新技术,来帮助用户建设更加智能的城市.更为健康的社区以及推动商业的繁荣发展,进而提高人们的生活水平. 英特尔公司高级副总裁兼数据中心及互联系统事业部总经理柏安娜 柏安娜还披露了即将推出的产品和技术的细节,展示了英特尔将在数据中心内推进的涉及服务器.网络和存储设备等领域的