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有两种方式:
长轮询:
页面发起一个到服务器的请求,服务器保持连接打开,直到有数据可发送,发送完数据后,浏览器关闭连接,浏览器随即又发起一个新的请求到服务器。对于客户端来说,不管是长轮询还是短轮询,客户端的动作都是一样的,就是不停的去请求,不同的是服务端,短轮询情况下服务端每次请求不管有没有变化都会立即返回结果,而长轮询情况下,如果有变化才会立即返回结果,而没有变化的话,则不会再立即给客户端返回结果,直到超时为止。这样一来,客户端的请求次数将会大量减少(这也就意味着节省了网络流量,毕竟每次发请求,都会占用客户端的上传流量和服务端的下载流量),而且也解决了服务端一直疲于接受请求的窘境。
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)过程。
• 在一个单独的持久连接上提供全双工、双向通信。(全双工是指数据可以同时在两个方向上传输)。
• Web Soclets是唯一一个能够通过同一个TCP连接实现双向通信的机制。
• Web Socket除最初建立连接时需HTTP协议,其他时候直接基于TCP完成通信。
(在JavaScript创建Web Sockets之后,会有一个HTTP请求发送到浏览器以发起到服务器的连接,服务器发回响应后,浏览器与服务器之间的连接会使用HTTP升级,从HTTP协议换位Web Sockets协议。)因此只有支持Web Sockets的服务器才能正常工作。
• 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)》
- Comet
- comet
- comet
- Comet
- Comet
- Comet
- comet
- comet
- comet
- Comet
- Comet
- comet
- Comet
- Comet
- comet.exe
- Comet简介
- comet收集
- 理解Comet
- 将二叉搜索树转化为一个排序的双向链表
- 【POJ3470】Walls(线段树)(扫描线)
- 逻辑回归算法简介及用python实现
- ireport+springmvc实现报表预览
- 初识git
- Comet
- asp实用sub小程序
- luogu1002【2002普及】过河卒(递推)
- 7月英语总结
- JavaScript实战-DOM操作之奇偶变色表格
- python->sorted
- C++实现一个线程安全且高效单例类
- Java文件读写操作(file I/O)
- 安卓属性动画一