对于comet长连接来说,服务端如有内容需要发送给客户端时,服务端将原本占用的连接进行回复,此时原有的连接断开,重新发起长连接,直到服务端有内容响应。从每次消息发送到收到服务端消息应答,平均需要两次HTTP请求,一次请求将消息内容提交到服务端,另外还需保持一个长连接,当服务端有内容响应时,及时发回响应,可以通过一个简单的案例来进行介绍:
GET /testwebsocket/conn?cmd=revival&cid=c6e2f82f-edb1-4b61-ba68-0d5c65d92d5e&ram=0.95148686459288 HTTP/1.1
Host: www.bbb.com:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36
Accept: */*
Referer: http://www.bbb.com:8080/testwebsocket/comet.htm
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Pragma: No-cache
Cache-Control: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Content-Type: text/html;charset=UTF-8
Content-Length: 74
Date: Tue, 08 Dec 2015 12:19:40 GMT
上面是为了保证服务端通知能及时到达客户端,客户端发送给服务端的长连接请求头以及服务端响应给客户端的响应头,一次来回不计算消息体,头的大小为686byte。
下面是将消息内容发送给服务端所发送请求的请求头,以及服务端响应的响应头:
GET /testwebsocket/send.do?message=message HTTP/1.1
Host: www.bbb.com:8080
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36
Referer: http://www.bbb.com:8080/testwebsocket/comet.htm
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Length: 0
Date: Tue, 08 Dec 2015 12:19:42 GMT
一次请求来回,不计消息体的大小,光是请求头及响应头,就占用了542byte。
换句话说,客户端给服务端发送一条消息,并且从服务端接收一次消息,总共要花费在请求头的代价是1228byte,而实际消息体的内容可能也并不大。
对于websocket来说,情况就不太一样了,websocket的浏览器端会先发送一个HTTP请求给服务端建立连接,服务端会回一个HTTP的响应,当连接建立好之后,浏览器端与服务端将通过frame的格式通信,中间附带的header信息几乎可忽略不计。
websocket建立连接的HTTP请求header:
GET /testwebsocket/websocket HTTP/1.1
Host: www.bbb.com:8080
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: http://www.bbb.com:8080
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.73 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Sec-WebSocket-Key: m9OzTVeeei/Hw12msI7jfw==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
服务端回应的响应头:
HTTP/1.1 101 Switching Protocols
Server: Apache-Coyote/1.1
Upgrade: websocket
Connection: upgrade
Sec-WebSocket-Accept: abEVNZcXPW+K1ptCD54EOh7xN0E=
Date: Tue, 08 Dec 2015 11:38:40 GMT
后续的通信,将直接是消息内容,额外附带信息几乎可忽略不计,那么第一次建立连接,将需要传输702byte(请求头与响应头)的数据,而后续的数据传输只跟消息本身相关。
那么,假设有如下三个场景,假设服务端每秒推送50条消息给前端用户,每条消息的长度为10byte,那么,对应不同的用户规模,客户端与服务端通信所传输的字节数如下:
1.假设同时在线人数为100人,采用comet长轮询方案服务端与客户端需要传输总的字节数=(50*(10+686))*100=3480kb,而采用websocket方式的话,服务端与客户端总共需要传输的字节数=(50*10+702)*100=75.2kb;
2. 假设同时在线人数为1000人,采用comet长轮询方案服务端与客户端需要传输总的字节数=(50*(10+686))* 1000=34800kb,而采用websocket方式的话,服务端与客户端总共需要传输的字节数=(50*10+702)*1000=752kb;
3. 假设同时在线人数为1w人,采用comet长轮询方案服务端与客户端需要传输总的字节数=(50*(10+686))*1w=348000kb,而采用websocket方式的话,服务端与客户端总共需要传输的字节数=(50*10+702)*1w=7520kb;
以上是对于服务端消息推送的场景,对于消息发送的场景以及comet的流方式的数据传输的性能对比类似,读者可参照上述方式自行计算。
相关推荐
6. **技术对比与优势**:与其他实时通信技术如WebSockets、Server-Sent Events (SSE)等进行比较,阐述Bayeux+Comet方案的独特优点。 【实现细节】 论文可能详细描述了如何实现Bayeux协议的各个部分,包括: - **...
一方面可以避免轮询带来的连接频繁建立与断开的性能损耗,另一方面数据可以是比较实时的进行双向传输(因为是长链接),而且WebSocket允许跨域通信(这里有个潜在的跨域安全的问题,得靠服务端来解决)。目前除IE外...
- **Nginx + Tomcat + Memcached + Websocket**:这种架构可以通过Nginx作为反向代理,Tomcat作为应用服务器,Memcached作为缓存,Websocket负责实时数据推送,共同实现高性能的实时Web应用。 - **Nginx配置**:...
因为 WebSocket 连接本质上就是一个 TCP 连接,所以在数据传输的稳定性和数据传输量的大小方面,和轮询以及 Comet 技术比较,具有很大的性能优势。 下面是一段简单的 JavaScript 代码展示了怎样建立 WebSocket 连接...
这篇博客文章可能还讨论了在实际项目中使用Comet技术的优缺点,以及与WebSocket等现代推送技术的比较。此外,可能会有遇到的问题和解决方案,例如处理并发连接、防止内存泄漏、异常处理等。 总的来说,了解并实践这...
知识点二:Comet与传统AJAX和WebSocket的比较 Comet的主要优势在于其广泛的适用性,与传统的AJAX轮询相比,Comet可以显著减少资源消耗,因为它避免了频繁的轮询请求,从而降低了服务器的负载和网络延迟。另外,Comet...
因为 WebSocket 连接本质上就是一个 TCP 连接,所以在数据传输的稳定性和数据传输量的大小方面,和轮询以及 Comet 技术比较,具有很大的性能优势。 SuperWebSocket 是一个基于 WebSocket 的实时 Web 应用框架,...
在性能对比上,WebSocket 明显优于传统的轮询技术。在WebSocket.org的测试中,WebSocket在数据传输量和网络负载上展现出显著优势,尤其是在高负载情况下,性能提升更为明显。 综上所述,WebSocket 是实时Web应用的...
它通过JavaScript API在浏览器端与Java方法交互,从而实现了Reverse Ajax(也称为Comet技术),即服务器向客户端推送数据的能力。** **一、DWR的核心功能** 1. **双向通信**:DWR提供了从浏览器到服务器以及从...
综上所述,"功能比较完善的聊天室"涉及到前端与后端的综合技术,包括但不限于前端框架、服务器端脚本、实时通信协议、数据库管理和网络安全措施。而“聊天室ASP”可能指的是使用ASP技术构建的聊天室后端部分,这需要...
协程三模PHP高性能框架V2.1 :基于Swoole 4.4+单线程协程PHP框架V2.2 :基于Swoole 4.4+单线程协程PHP微服务框架 :NEW_button:与传统MVC框架比较传统框架大部分都是在HTTP领域开发,而Mix可以开发HTTP,WebSocket,...
这通常通过与数据库的交互完成,比较用户输入与数据库中存储的凭证。 - 错误处理:当验证失败时,应向用户返回错误信息。成功登录后,可以使用Session对象来存储用户的登录状态,以便在后续的聊天页面中识别用户。 ...
章节可能介绍了WebSocket API的使用,以及如何在Ajax应用中整合WebSocket,实现双向即时通信功能。 2. **Comet技术**:这是一种服务器推送技术,允许服务器主动向客户端发送数据。章节可能探讨了长轮询、流等Comet...
8. **Ajax与Comet** (第08章) - **Comet技术**:长轮询和流式传输,实现服务器向客户端推送数据。 9. **Ajax与Web存储** (第09章) - **Cookie、LocalStorage和SessionStorage**:讲解三种在客户端存储数据的方式...
**四、DWR与其他技术的比较** 1. **Ajax**:Ajax通常需要手动触发请求,而DWR可以实现服务器向客户端的自动推送。 2. **WebSocket**:WebSocket提供全双工通信,但兼容性不如DWR。DWR适用于对老版本浏览器的支持...
4. **Jetty与Tomcat对比**:虽然两者都是流行的servlet容器,Jetty通常被认为更加轻量级,启动更快,更适合嵌入式场景,而Tomcat可能更适合大型企业级应用,提供更全面的功能。 5. **安装与启动**:Jetty的安装过程...
接着,书中详细讲述了Jetty的历史和现状,以及与Tomcat等其他Web服务器的对比,帮助读者理解Jetty的独特优势。 在技术细节部分,作者从下载、安装和启动Jetty开始,逐步引导读者熟悉Jetty的使用。通过Java命令启动...