福州大型网站建设,广西建设,培训心得体会800字,dw做网站的搜索栏怎么做commet与websocket
Comet
前言
Comet是一种用于web的技术#xff0c;能使服务器能实时地将更新的信息传送到客户端#xff0c;而无须客户端发出请求#xff0c;目前有两种实现方式#xff0c;长轮询和iframe流。 实现方式
长轮询
长轮询是在打开一条连接以后保持…commet与websocket
Comet
前言
Comet是一种用于web的技术能使服务器能实时地将更新的信息传送到客户端而无须客户端发出请求目前有两种实现方式长轮询和iframe流。 实现方式
长轮询
长轮询是在打开一条连接以后保持等待服务器推送来数据再关闭的方式。
iframe流
iframe流方式是在页面中插入一个隐藏的iframe利用其src属性在服务器和客户端之间创建一条长链接服务器向iframe传输数据通常是HTML内有负责插入信息的javascript来实时更新页面。 iframe流方式的优点是浏览器兼容好Google公司在一些产品中使用了iframe流如Google Talk。
发展历程
从http协议说起
1996年IETF HTTP工作组发布了HTTP协议的1.0版本 到现在普遍使用的版本1.1HTTP协议经历了17 年的发展。这种分布式、无状态、基于TCP的请求/响应式、在互联网盛行的今天得到广泛应用的协议相对于互联网的迅猛发展它似乎进步地很慢。互联网从兴起到现在经历了门户网站盛行的web1.0时代而后随着ajax技术的出现发展为web应用盛行的web2.0时代如今又朝着web3.0的方向迈进。反观http协议从版本1.0发展到1.1除了默认长连接之外就是缓存处理、带宽优化和安全性等方面的不痛不痒的改进。它一直保留着无状态、请求/响应模式似乎从来没意识到这应该有所改变。
Ajax—脚本发送的http请求
传统的web应用要想与服务器交互必须提交一个表单form服务器接收并处理传来的表单然后返回全新的页面因为前后两个页面的数据大部分都是相同的这个过程传输了很多冗余的数据、浪费了带宽。于是Ajax技术便应运而生。 Ajax是Asynchronous JavaScript and XML的简称由Jesse James Garrett 首先提出。这种技术开创性地允许浏览器脚本JS发送http请求。Outlook Web Access小组于98年使用并很快成为IE4.0的一部分但是这个技术一直很小众直到2005年初google在他的goole groups、gmail等交互式应用中广泛使用此种技术才使得Ajax迅速被大家所接受。 Ajax的出现使客户端与服务器端传输数据少了很多也快了很多也满足了以丰富用户体验为特点的web2.0时代 初期发展的需要但是慢慢地也暴露了他的弊端。比如无法满足即时通信等富交互式应用的实时更新数据的要求。这种浏览器端的小技术毕竟还是基于http协议http协议要求的请求/响应的模式也是无法改变的除非http协议本身有所改变。
Comet—一种hack技术
以即时通信为代表的web应用程序对数据的Low Latency要求传统的基于轮询的方式已经无法满足而且也会带来不好的用户体验。于是一种基于http长连接的“服务器推”技术便被hack出来。这种技术被命名为Comet这个术语由Dojo Toolkit 的项目主管Alex Russell在博文Comet: Low Latency Data for the Browser首次提出并沿用下来。 其实服务器推很早就存在了在经典的client/server模型中有广泛使用只是浏览器太懒了并没有对这种技术提供很好的支持。但是Ajax的出现使这种技术在浏览器上实现成为可能 google的gmail和gtalk的整合首先使用了这种技术。随着一些关键问题的解决比如 IE 的加载显示问题很快这种技术得到了认可目前已经有很多成熟的开源Comet框架。 以下是典型的Ajax和Comet数据传输方式的对比区别简单明了。典型的Ajax通信方式也是http协议的经典使用方式要想取得数据必须首先发送请求。在Low Latency要求比较高的web应用中只能增加服务器请求的频率。Comet则不同客户端与服务器端保持一个长连接只有客户端需要的数据更新时服务器才主动将数据推送给客户端。
Comet的实现主要有两种方式
基于Ajax的长轮询long-polling方式 浏览器发出XMLHttpRequest 请求服务器端接收到请求后会阻塞请求直到有数据或者超时才返回浏览器JS在处理请求返回信息超时或有效数据后再次发出请求重新建立连接。在此期间服务器端可能已经有新的数据到达服务器会选择把数据保存直到重新建立连接浏览器会把所有数据一次性取回。
基于 Iframe 及 htmlfile 的流http streaming方式
Iframe是html标记这个标记的src属性会保持对指定服务器的长连接请求服务器端则可以不停地返回数据相对于第一种方式这种方式跟传统的服务器推则更接近。
在第一种方式中浏览器在收到数据后会直接调用JS回调函数但是这种方式该如何响应数据呢可以通过在返回数据中嵌入JS脚本的方式如“”服务器端将返回的数据作为回调函数的参数浏览器在收到数据后就会执行这段JS脚本。
但是这种方式有一个明显的不足之处IE、Morzilla Firefox 下端的进度栏都会显示加载没有完成而且 IE 上方的图标会不停的转动表示加载正在进行。Google 的天才们使用一个称为“htmlfile”的 ActiveX 解决了在 IE 中的加载显示问题并将这种方法应用到了 gmailgtalk 产品中。
websocket
Websocket—未来的解决方案 如果说Ajax的出现是互联网发展的必然那么Comet技术的出现则更多透露出一种无奈仅仅作为一种hack技术因为没有更好的解决方案。Comet解决的问题应该由谁来解决才是合理的呢浏览器html标准还是http标准主角应该是谁呢本质上讲这涉及到数据传输方式http协议应首当其冲是时候改变一下这个懒惰的协议的请求/响应模式了。W3C给出了答案在新一代html标准html5中提供了一种浏览器和服务器间进行全双工通讯的网络技术Websocket。从Websocket草案得知Websocket是一个全新的、独立的协议基于TCP协议与http协议兼容、却不会融入http协议仅仅作为html5的一部分。于是乎脚本又被赋予了另一种能力发起websocket请求。这种方式我们应该很熟悉因为Ajax就是这么做的所不同的是Ajax发起的是http请求而已。与http协议不同的请求/响应模式不同Websocket在建立连接之前有一个HandshakeOpening Handshake过程在关闭连接前也有一个HandshakeClosing Handshake过程建立连接之后双方即可双向通信。Opening Handshake
客户端发起连接Handshake请求
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13服务器端响应
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbKxOo
Sec-WebSocket-Protocol: chat“UpgradeWebSocket”表示这是一个特殊的 HTTP 请求请求的目的就是要将客户端和服务器端的通讯协议从 HTTP 协议升级到 WebSocket 协议。 “Sec-WebSocket-Key”是一段浏览器base64加密的密钥 “Sec-WebSocket-Accept”服务器端在接收到的Sec-WebSocket-Key密钥后追加一段神奇字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”并将结果进行sha-1哈希然后再进行base64加密返回给客户端。 “Sec-WebSocket-Protocol”表示客户端请求提供的可供选择的子协议及服务器端选中的支持的子协议“Origin”服务器端用于区分未授权的websocket浏览器 “HTTP/1.1 101 Switching Protocols”中101为服务器返回的状态码所有非101的状态码都表示handshake并未完成。 Data Framing Websocket协议通过序列化的数据包传输数据。数据封包协议中定义了opcode、payload length、Payload data等字段。具体封包格式如下图所示
FIN: 标识是否为此消息的最后一个数据包占 1 bit RSV1, RSV2, RSV3: 用于扩展协议一般为0各占1bit Opcode数据包类型frame type占4bits 0x0标识一个中间数据包 0x1标识一个text类型数据包 0x2标识一个binary类型数据包 0x3-7保留 0x8标识一个断开连接类型数据包 0x9标识一个ping类型数据包 0xA表示一个pong类型数据包 0xB-F保留 Payload lengthPayload data的长度占7bits如果这个值等于126则此后16bits用于表示Payload length如果这个值等于127则此后64bits用于表示Payload length Payload data应用层数据
Closing Handshake
相对于Opening HandshakeClosing Handshake则简单得多主动关闭的一方向另一方发送一个关闭类型的数据包对方收到此数据包之后再回复一个相同类型的数据包关闭完成。 关闭类型数据包遵守封包协议Opcode为0x8Payload data可以用于携带关闭原因或消息。 虽然现阶段websocket协议还处于草案阶段不过浏览器早就开始开始支持了以下是不同浏览器兼容列表: