对于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的流方式的数据传输的性能对比类似,读者可参照上述方式自行计算。
相关推荐
虽然现在有些技术如服务器推(如 Comet)、还有现在的 HTML5 websocket 可以实现 Web 服务器主动通知 Web 客户端。到此我们了解了在 web 开发时的请求/响应模型,接下来我们看一下标准的 MVC 模型是什么。
vue websocket 与 delphi10.2 websocket 通讯读取卡信息 研究ppapi遇到阻碍,换了websocket实现了谷歌和本地资源访问
本项目帮助你在spring-boot中使用Netty来开发WebSocket服务器,并像spring-websocket的注解开发一样简单
此资源为websocket的页面源码,配合Spring boot 2基于Netty的高性能Websocket服务器(心跳模式) 文章来使用
性能测试工具 websocket-bench 完美可用 用于实现webservice性能测试
Spring+Netty+WebSocket实例,通用性还行,比较贴近生产,注释什么写的比较全
用websocket发送信令消息,用WebRtc传输音视频消息。测试通过,对需要的人妖帮助
使用c#编写websocket服务端,使用vue编写的客户端,在一台电脑上实现vue发起访问指令,通过websocket协议访问本机websocket服务,服务端接收到指令后开发访问本地资源。不明白的地方加qq286194946
unty websocket 客户端 服务端 通信 使用WebSocketSharp框架
Websocket与服务器的正常通信 可以用客户端测试任意语言的服务端,也可以用服务端测试任意语言的客户端 众所周知,Web 应用的交互过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给...
本篇博客介绍微信小程序中webSocket的使用方法,以及如何用局部网络建立webSocket连接,进行客户端与服务器之间的对话: webSocket简介 微信小程序端API调用 服务器端使用nodejs配置 演示websocket webSocket...
该文档详细讲解了websocket的原理、如何使用websocket开发等
WebSocket for Delphi
依赖webSocket、mybatis的演示项目,其中有账号登录模块、数据处理模块(增删改查),json格式数据交互,数据分段发送处理,dao层使用mybatis框架。
4、数据格式比较轻量,性能开销小,通信高效。 5、可以发送文本,也可以发送二进制数据。 6、没有同源限制,客户端可以与任意服务器通信。 7、协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。 ————...
应读者要求 写个了一个简单地springboot+websocket实现进度条的demo。
spring boot+websocket网页上使用的是jquery写的,网页放在resources\static目录里边,下载直接运行就可以
主要介绍了C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析,包括websocket sharp组件的概念及使用方法,需要的朋友可以参考下
使用易语言支持库服务器组件 简单的通讯源码 没有任何模块 本源码只有WS://协议 需要的可以研究!
websocket有多种实现方式tomcat,spring等等自己百度,这里是spring的实现方式。