Comet

来源:互联网 发布:梦幻西游mac版安装教程 编辑:程序博客网 时间:2024/05/18 00:56

Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和流
Comet是“彗星”的意思,顾名思义,彗星有个长长的尾巴,以此来说明客户端发起的请求是长连接的。即用户发起请求后就挂起,等待服务器返回数据,在此期间不会断开连接。

HTTP分为长连接和短连接,其实本质上是说的TCP连接。TCP连接是一个双向的通道,它是可以保持一段时间不关闭的,因此TCP连接才有真正的长连接和短连接这一说。HTTP协议说到底是应用层的协议,而TCP才是真正的传输层协议,只有负责传输的这一层才需要建立连接,HTTP协议是基于请求/响应模式的,因此只要服务端给了响应,本次HTTP连接就结束了。

长连接就是多个HTTP请求可以复用同一个TCP连接,可以节省很多TCP连接建立和断开的消耗。(HTTP1.0协议不支持长连接,从HTTP1.1协议以后,连接默认都是长连接,设置HTTP头部的Connection为keep-alive


【Comet】

▪ Ajax是页面向服务器请求数据的技术,而Comet是服务器向页面推送数据的技术。

▪ Comet能让信息几乎实时地推送到页面上,适用于监控系统、即时通信系统(体育比赛的分数报道、用户登录、用户发送信息)、即时报价系统(股票报价)。

▪ 实现Comet有两种方式:

  1. 长轮询
    页面发起一个到服务器的请求,服务器保持连接打开,直到有数据可发送,发送完数据后,浏览器关闭连接,浏览器随即又发起一个新的请求到服务器。

    对于客户端来说,不管是长轮询还是短轮询,客户端的动作都是一样的,就是不停的去请求,不同的是服务端,短轮询情况下服务端每次请求不管有没有变化都会立即返回结果,而长轮询情况下,如果有变化才会立即返回结果,而没有变化的话,则不会再立即给客户端返回结果,直到超时为止。这样一来,客户端的请求次数将会大量减少(这也就意味着节省了网络流量,毕竟每次发请求,都会占用客户端的上传流量和服务端的下载流量),而且也解决了服务端一直疲于接受请求的窘境。

  2. HTTP流
    在页面的整个生存周期内只使用一个HTTP连接,即页面向服务器发送一个请求,服务器保持连接打开,然后周期性地向页面发送数据。

    通过侦听readystatechange事件,以及检测readyState属性值是否为3来实现HTTP流。当readyState属性值变为3时,responseText属性中会保存接收到的所有数据。

//progress是接收到数据时调用的函数,finished是关闭连接时调用的函数。    function createStreamingClient(url, progress,finished){        var xhr = createXHR(),            received = 0;        xhr.open("get",url,true);        xhr.onreadystatechange = function(){            var result;            if(xhr.readyState == 3){                //对responseText进行分割,取得最新的数据                result = xhr.responseText.substring(received);                received += result.length;                //调用progress回调函数                progress(result);            }            else if(xhr.readyState == 4){                //传入响应返回的全部内容                finished(xhr.responseText);            }        };        xhr.send(null);        return xhr;    }    var client = createStreamingClient("streaming.php", function(data){        console.log("received"+data);},function(data){console.log("完成");});

【流方式和长轮询方式的区别】:

Ø 对于流方式,客户端发起连接就不会断开连接,而是由服务器端进行控制,当服务器端有更新时,刷新数据,客户端进行更新;

Ø 而对于长轮询,当服务器端有更新返回,客户端先断开连接,进行处理,然后重新发起连接。


【SSE服务器发送事件】

• SSE(Server-Sent Events)服务器发送事件用于创建到服务器的单向连接
• 服务器响应的MIME类型必须是text/event-stream
• SSE支持短轮询、长轮询、HTTP流。
• SSE能在断开连接时自动确定何时重新连接。
• 服务器发回的数据以字符串形式保存在EventSource对象的event.data中。
• 默认情况下,EventSource对象会保持与服务器的连接,若想强制断开连接且不再重新连接,可调用close()方法。

1.创建SSE

var source = new EventSource(URL); //传入的URL必须与创建对象的页面同源(协议、域、端口)

2.SSE属性和事件
EventSource的实例有个readyState属性:

    0:正连接到服务器    1:打开了连接    2:关闭了连接

EventSource有3个事件:

1. open: 在建立连接时触发2. message:从服务器接收到新事件时触发(可以给特定的事件指定一个关联的ID,以便EventSource对象跟踪上一次触发的事件。如果连接断开,会向服务器发送一个HTTP头部“Last-Event-ID”,好让服务器知道下一次该触发哪个事件。)3. error:无法建立连接时触发

【Web Sockets】

Websocket在建立连接之前有一个Handshake(Opening Handshake)过程,建立连接之后,双方即可双向通信。在关闭连接前也有一个Handshake(Closing Handshake)过程。
WebSocket
• 在一个单独的持久连接上提供全双工、双向通信。(全双工是指数据可以同时在两个方向上传输)。
• Web Soclets是唯一一个能够通过同一个TCP连接实现双向通信的机制。
• Web Socket除最初建立连接时需HTTP协议,其他时候直接基于TCP完成通信。
(在JavaScript创建Web Sockets之后,会有一个HTTP请求发送到浏览器以发起到服务器的连接,服务器发回响应后,浏览器与服务器之间的连接会使用HTTP升级,从HTTP协议换位Web Sockets协议。)因此只有支持Web Sockets的服务器才能正常工作。
WebSpcket
• Web Sockets使用自定义的协议,其URL模式也不同:

未加密的连接:ws://加密的连接:wss://

• Web Sockets协议传递的数据包很小,不像HTTP那样的字节级开销,因此很适合移动应用。


1.创建Web Socket

//注意:传入的URL是绝对URLvar socket = new WebSocket("ws://www.example.com/server.php");

实例化WebSocket对象之后,浏览器会马上尝试创建连接。

WebSocket对象readyState属性的值与XHR不同:

0:正在建立连接1:已经建立连接2:正在关闭连接3:已经关闭连接

2.发送和接收数据

socket.send("序列化的字符串");

接收的数据在message事件的event.data

3.WebSocket对象的事件
WebSocket没有readystatechange事件。但有以下事件:

1. open     在成功建立连接时触发2. error    在发生错误时触发3. close    在连接关闭时触发。其中close事件的event有三个额外的属性:            1) wasclean   连接是否已经关闭            2) code       服务器返回的数值状态码            3) reason     服务器发回的消息

【参考文档】
《谈谈HTTP协议中的短轮询、长轮询、长连接和短连接》
《Comet 和 WebSocket》
【推荐阅读】
《Web 通信 之 长连接、长轮询(long polling)》