`
nick2015
  • 浏览: 10587 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JavaScript之web通信

 
阅读更多
一、前言

1. comet技术

浏览器作为 Web 应用的前台,自身的处理功能比较有限。浏览器的发展需要客户端升级软件,同时由于客户端浏览器软件的多样性,在某种意义上,也影响了浏览器新技术的推广。在 Web 应用中,浏览器的主要工作是发送请求、解析服务器返回的信息以不同的风格显示。AJAX 是浏览器技术发展的成果,通过在浏览器端发送异步请求,提高了单用户操作的响应性。但 Web 本质上是一个多用户的系统,对任何用户来说,可以认为服务器是另外一个用户。现有 AJAX 技术的发展并不能解决在一个多用户的 Web 应用中,将更新的信息实时传送给客户端,从而用户可能在“过时”的信息下进行操作。而 AJAX 的应用又使后台数据更新更加频繁成为可能。

随着互联网的发展,web 应用层出不穷,也不乏各种网站监控、即时报价、即时通讯系统,为了让用户得到更好的体验,服务器需要频繁的向客户端推送信息。开发者一般会采用基于 AJAX 的长轮询方式或者基于 iframe 及 htmlfile 的流方式处理。当然有些程序需要在客户端安装各种插件( Java applet 或者 Flash )来支持性能比较良好的“推”信息。

2. HTTP协议中的长、短连接

短连接的操作步骤是:建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
长连接的操作步骤是:建立连接——数据传输...(保持连接)...数据传输——关闭连接

长连接与短连接的不同主要在于client和server采取的关闭策略不同。短连接在建立连接以后只进行一次数据传输就关闭连接,    而长连接在建立连接以后会进行多次数据数据传输直至关闭连接(长连接中关闭连接通过Connection:closed头部字段)。

二、web 通信

首先要搞清楚,xhr 的 readystate 各种状态。

属性 描述
onreadystatechange 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
readyState 存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。

0: 请求未初始化
1: 服务器连接已建立
2: 请求已接收
3: 请求处理中
4: 请求已完成,且响应已就绪
status 200: "OK"
404: 未找到页面


1.轮询

轮询是一种“拉”取信息的工作模式。设置一个定时器,定时询问服务器是否有信息,每次建立连接传输数据之后,链接会关闭。
前端实现:

var polling = function(url, type, data){  
  var xhr = new XMLHttpRequest(),     
    type = type || "GET",       
   data = data || null;  
   xhr.onreadystatechange = function(){      

if(xhr.readyState == 4) {        
    receive(xhr.responseText);       
     xhr.onreadystatechange = null;      
  }    
};   
xhr.open(type, url, true);    
//IE的ActiveXObject("Microsoft.XMLHTTP")支持GET方法发送数据,


//其它浏览器不支持,已测试验证

  xhr.send(type == "GET" ? null : data);
};
var timer = setInterval(function(){ 
   polling();}, 1000);


在轮询的过程中,如果因为网络原因,导致上一个 xhr 对象还没传输完毕,定时器已经开始了下一个询问,上一次的传输是否还会在队列中,这个问题我没去研究。如果感兴趣可以自己写一个ajax的请求管理队列。

2.长轮询(long-polling)

长轮询其实也没啥特殊的地方,就是在xhr对象关闭连接的时候马上又给他接上~ 看码:

var longPoll = function(type, url){   
var xhr = new XMLHttpRequest();  
  xhr.onreadystatechange = function(){           // 状态为 4,数据传输完毕,重新连接   
     if(xhr.readyState == 4) {     
     receive(xhr.responseText);   
     xhr.onreadystatechange = null;       
     longPoll(type, url);        } 
   };   
  xhr.open(type, url, true);  
  xhr.send();
}


只要服务器断开连接,客户端马上连接,不让他有一刻的休息时间,这就是长轮询。

3.数据流

数据流方式,在建立的连接断开之前,也就是 readystate 状态为 3 的时候接受数据,但是麻烦的事情也在这里,因为数据正在传输,你拿到的 xhr.response 可能就是半截数据,所以呢,最好定义一个数据传输的协议,比如前2个字节表示字符串的长度,然后你只获取这个长度的内容,接着改变游标的位置。

假如数据格式为: data splitChar data为数据内容,splitChar为数据结束标志(长度为1)。
那么传输的数据内容为 data splitChar data splitChar data splitChar...

var dataStream = function(type, url){
    var xhr = new XMLHttpRequest();

    xhr.onreadystatechange = function(){

        // 状态为 3,数据接收中
        if(xhr.readyState == 3) {
            var i, l, s;

            s = xhr.response; //读取数据
            l = s.length;     //获取数据长度

            //从游标位置开始获取数据,并用分割数据
            s = s.slice(p, l - 1).split(splitChar);

            //循环并操作数据
            for(i in s) if(s)  deal(s);

            p = l;  //更新游标位置

        }

        // 状态为 4,数据传输完毕,重新连接
        if(xhr.readyState == 4) {
            xhr.onreadystatechange = null;

            dataStream(type, url);
        }
    };

    xhr.open(type, url, true);
    xhr.send();
};


这个代码写的是存在问题的,当readystate为3的时候可以获取数据,但是这时获取的数据可能只是整体数据的一部分,那后半截就拿不到了。readystate在数据传输完毕之前是不会改变的,也就是说他并不会继续接受剩下的数据。我们可以定时去监听readystate,这个下面的例子中可以看到。

这样的处理不算复杂,但是存在问题。上面的轮询和长轮询是所有浏览器都支持的,所以我就没有写兼容IE的代码,但是这里,低版本IE不允许在readystate为3的时候读取数据,所以我们必须采用其他的方式来实现。

在ajax还没有进入web专题之前,我们已经拥有了一个法宝,那就是iframe,利用iframe照样可以异步获取数据,对于低版本IE可以使用iframe开接受数据流。

if(isIE){
    var dataStream = function(url){
        var ifr = document.createElement("iframe"), doc, timer;

        ifr.src = url;
        document.body.appendChild(ifr);

        doc = ifr.contentWindow.document;

        timer = setInterval(function(){

            if(ifr.readyState == "interactive"){
                // 处理数据,同上
            }

            // 重新建立链接
            if(ifr.readyState == "complete"){
                clearInterval(timer);

                dataStream(url);
            }
        }, 16);
    };
};


定时去监听iframe的readystate的变化,从而获取数据流,不过,上面的处理方式还是存在问题。数据流实现“服务器推”数据的原理是什么呢,简单点说,就是文档(数据)还没有加载完,这个时候浏览器的工作就是去服务器拿数据完成文档(数据)加载,我们就是利用这点,给浏览器塞点东西过去~ 所以上述利用iframe的方式获取数据,会使浏览器一直处于加载状态,title上的那个圈圈一直在转动,鼠标的状态也是loading,这看着是相当不爽的。幸好,IE提高了HTMLFile对象,这个对象就相当于一个内存中的Document对象,它会解析文档。所以我们创建一个HTMLFile对象,在里面放置一个IFRAME来连接服务器。这样,各种浏览器就都支持了。

if(isIE){
    var dataStream = function(url){
        var doc = new ActiveXObject("HTMLFile"), 
            ifr = doc.createElement("iframe"), 
            timer, d;

        doc.write("<body/>");

        ifr.src = url;
        doc.body.appendChild(ifr);

        d = ifr.contentWindow.document;

        timer = setInterval(function(){

            if(d.readyState == "interactive"){
                // 处理数据,同上
            }

            // 重新建立链接
            if(d.readyState == "complete"){
                clearInterval(timer);

                dataStream(url);
            }
        }, 16);
    };
};


4.websocket

websocket是前端一个神器,ajax用了这么久了,相关技术也是很成熟,不过要实现个数据的拉取确实十分不易,从上面的代码中也看到了,各种兼容性问题,各种细节处理问题,自从有了websocket,哈哈,一口气上五楼...

var ws = new WebSocket("ws://www.example.com:8888");

ws.onopen = function(evt){};
ws.onmessage = function(evt){
    deal(evt.data);
};
ws.onclose  = function(evt){};

//ws.close();


新建一个WebSocket实例,一切就OK了,ws:// 是websocket的连接协议,8888为端口号码。onmessage中提供了data这个属性,相当方便

5.EventSource

HTML5中提供的EventSource这玩意儿,这是无比简洁的服务器推送信息的接受函数。

new EventSource("test.php").onmessage=function(evt){
    console.log(evt.data);
};


简洁程度和websocket是一样的啦,只是这里有一个需要注意的地方,test.php输出的数据流应该是特殊的MIME类型,要求是"text/event-stream",如果不设置的话,你试试~ (直接抛出异常)

6.ActionScript

情非得已就别考虑这第六种方式了,虽说兼容性最好,要是不懂as,出了点bug你也不会调试。

具体实现方法:在 HTML 页面中内嵌入一个使用了 XMLSocket 类的 Flash 程序。JavaScript 通过调用此 Flash 程序提供的套接口接口与服务器端的套接口进行通信。JavaScript 在收到服务器端以 XML 格式传送的信息后可以很容易地控制 HTML 页面的内容显示。

7.Java Applet套接口

这玩意儿原理和Flash类似,不过我不懂,就不细说了。

三、后端处理方式

本文主要是总结Javascript的各种通讯方式,后端配合node来处理,应该是挺给力的。

var conns = new Array();

var ws = require("websocket-server");
var server = ws.createServer();

server.addListener("connection", function(connection){
  console.log("Connection request on Websocket-Server");
  conns.push(connection);
  connection.addListener('message',function(msg){
        console.log(msg);
        for(var i=0; i<conns.length; i++){
            if(conns!=connection){
                conns.send(msg);
            }
        }
    });
});
server.listen(8888);


下面是一个php的测试demo。

header('Content-Type:text/html; charset=utf-8');
while(1){
    echo date('Y-m-d H:i:s');
    flush();
    sleep(1);
};


四、web 通信方式利弊分析

轮询,这种方式应该是最没技术含量的,操作起来最方便,不过是及时性不强,把定时器的间隔时间设置的短一些可以稍微得到缓和。
长轮询,算是比较不错的一个web通讯方式,不过每次断开连接,比较耗服务器资源,客户端到无所谓。
数据流,他和长轮询不同之处是接受数据的时间不一样,数据流是readystate为3的时候接受,低版本IE不太兼容,处理起来略麻烦,而且还要自己设计数据传输协议。不过他对资源的消耗比上面几种都可观。
websocket和EventSource,两个利器,不过,没几个浏览器支持,这是比较让人伤心~
ActionScript和Java Applet,两者都是需要在客户端安装插件的,一个是Flash插件,一个是Java插件,而且搞前端的人一般对这东西不太熟悉,如果没有封装比较好的库可以使用,那建议还是别用了。

五、参考资料

http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ Comet:基于 HTTP 长连接的“服务器推”技术
http://blog.csdn.net/yankai0219/article/details/8208776 HTTP协议中长连接、短连接
http://www.web-tinker.com/ comet系列文章 推荐订阅

本文源自博客园
分享到:
评论

相关推荐

    JavaScript调用WEB服务

    在本场景中,我们探讨的是如何使用JavaScript与Web服务接口进行通信,以检查数据库中是否存在特定记录,并根据结果更新前端界面。 1. **Ajax技术**:在JavaScript中,实现客户端与服务器的异步数据交换主要依靠Ajax...

    Professional JavaScript for Web Developers 2nd Edition

    3. **DOM操作**:JavaScript在Web开发中的重要角色之一就是与DOM(Document Object Model)交互,书中详述了如何创建、修改和遍历DOM树,以及事件处理机制。 4. **Ajax与异步通信**:讲解了如何使用XMLHttpRequest...

    JavaScript与Web Service组和实现Ajax五刷新通信(扩展)

    JavaScript与Web Service结合实现Ajax无刷新通信是一种现代Web开发中的核心技术,它极大地提升了用户体验,使得网页可以在不重新加载整个页面的情况下进行数据交换。Ajax(Asynchronous JavaScript and XML)并不是...

    JavaScript Web Application

    ### JavaScript Web 应用程序开发相关知识点 #### 一、MVC 架构与 JavaScript Web 富应用 《JavaScript Web 富应用开发》一书详细介绍了如何利用现代 Web 技术构建下一代互联网富应用程序。随着 MVC(Model-View-...

    javascript实现串口通信(亲身测试).zip_MSComm 判断 通_js串口r232_touchu5v_上位机_串口通

    本文将详细探讨如何利用JavaScript来实现串口通信,结合MSComm控件进行实际操作,并针对“javascript实现串口通信(亲身测试).zip”中的内容进行解析。 首先,我们要了解JavaScript本身并不直接支持串口通信,因为...

    QT应用程序与web页面通信

    6. **实际应用**:这种通信方式常用于构建混合应用,比如电子阅读器、桌面版社交媒体客户端等,它们需要展示Web内容并与之交互。此外,它也可以用于在桌面应用中嵌入自定义的Web服务或API调用。 综上所述,QT应用...

    javascript 调用Web service

    总的来说,JavaScript调用Web服务是Web开发中的基础技能,它涉及到异步编程、网络通信和数据解析等多个方面。通过学习和实践此类示例,开发者能够提升前后端交互的能力,更好地构建动态和高效的Web应用。

    JavaScript云Web桌面平台

    1. **JavaScript技术**:JavaScript是一种广泛应用于Web开发的脚本语言,它在浏览器端运行,用于处理用户交互、动态内容更新以及与服务器的通信。在云Web桌面平台中,JavaScript不仅用于页面交互,还负责实现操作...

    Python测试驱动开发:使用Django、Selenium和JavaScript进行Web编程(第2版)》高清文字版,带书签。中英文都有哦!

    在本书中,JavaScript主要与前端开发相关,包括DOM操作、AJAX异步请求、以及与后端通过API通信等。同时,现代JavaScript(如ES6+)的新特性也为开发提供了更多可能性,如模块化、Promise、Async/Await等。 6. **...

    Professional.JavaScript.for.Web.Developers.3rd.Edition

    8. **跨域通信与安全**:CORS(跨源资源共享)和JSONP等机制用于解决JavaScript的同源策略限制,同时,了解XSS(跨站脚本攻击)和CSRF(跨站请求伪造)等安全问题的防范方法也是必要的。 9. **移动与响应式开发**:...

    JavaScript Web Service Calls

    总的来说,这个项目涉及了使用JavaScript从客户端调用.NET编写的Web服务,通过SOAP协议进行通信,并提供了异常处理、日志记录以及可能的CRM功能。在实际开发中,理解这些组件的工作原理和交互方式对于成功地实现...

    javascript实现串口通信(亲身测试).rar

    JavaScript是一种广泛应用于Web开发的脚本语言,通常用于处理页面上的动态内容。然而,JavaScript本身并不直接支持硬件级别的串口通信。在标题“javascript实现串口通信(亲身测试).rar”中,提及的是如何利用...

    JavaScript和Flash的通信(转)

    ### JavaScript和Flash之间的通信 随着Web技术的发展,不同的媒体组件如JavaScript和Flash之间进行交互的需求逐渐增加。在本文中,我们将深入探讨JavaScript和Flash如何实现跨语言通信,并提供实际的应用案例来帮助...

    基于node-serialport的WEB串口通信 上位机工具

    【基于node-serialport的WEB串口通信上位机工具】是一种使用JavaScript和Node.js环境构建的串口通信解决方案,特别适用于需要通过Web界面进行串口数据交互的应用场景。这个工具利用了`node-serialport`库,它是一个...

    JavaScript通过Web Service实现AJAX无刷新数据交互

    JavaScript通过Web Service实现AJAX无刷新数据交互是一种常见的前端与后端通信技术,它极大地提升了网页的用户体验。AJAX(Asynchronous JavaScript and XML)的核心在于异步更新页面内容,而无需用户手动刷新整个...

    web_javaweb前端模版_javascript_web前端模板_css_web登录_

    同时,JavaScript也可以与后端的Java通过API接口进行通信,实现数据的交换。 CSS(层叠样式表)则负责页面的布局和视觉呈现。在这个模板中,CSS被用于定义元素的样式,如颜色、字体、布局等,确保页面的美观和一致...

    JavaScript+jQuery交互式Web前端开发-源代码.zip

    JavaScript 和 jQuery 是现代 Web 前端开发中的两个核心工具,它们共同为创建动态、交互式的网页提供了强大的功能。在本教程中,我们将深入探讨如何将这两种技术与 HTML 和 CSS 结合,以实现高效的网页设计。 ...

    全JavaScript语言Web实现学习项目

    JavaScript是一种广泛用于网页和网络应用的脚本语言,它是Web开发的三大核心技术之一,与HTML和CSS共同构建了互联网的基石。JavaScript允许动态内容的创建,使用户可以在不刷新页面的情况下与网页进行交互,极大地...

    Web编程基础——CSS、JavaScript、jQuery【高清版】

    《Web编程基础——CSS、JavaScript、jQuery》是一本旨在教授Web前端开发基础知识的教程,涵盖了网页样式设计、动态脚本语言以及广泛使用的JavaScript库。在Web开发领域,这三者是构建交互式和响应式网站不可或缺的...

Global site tag (gtag.js) - Google Analytics