websocke前世今生
注:以下内容来自网上。本人经过加工整理。
1、问什么要用websocke?
Browser已经支持http协议,为什么还要开发一种新的WebSocket协议呢?我们知道http协议是一种单向的网络协议。在建立连接后,它仅仅同意Browser/UA(UserAgent)向WebServer发出请求资源后。WebServer才干返回对应的数据。而WebServer不能主动的推送数据给Browser/UA,当初这么设计http协议也是有原因的。如果WebServer能主动的推送数据给Browser/UA,那Browser/UA就太easy受到攻击,一些广告商也会主动的把一些广告信息在不经意间强行的传输给client,这不能不说是一个灾难。那么单向的http协议给如今的站点或Web应用程序开发带来了哪些问题呢?
在http协议上要实现browser获取server端实时数据的需求(比如:股票实时交易)。往往使用下面两种方案:
1)polling
这样的方式就是通过Browser/UA定时的向Webserver发送http的Get请求,server收到请求后,就把最新的数据发回给client(Browser/UA),Browser/UA得到数据后。就将其显示出来,然后再定期的反复这一过程。尽管这样能够满足需求。可是也仍然存在一些问题,比如在某段时间内Webserver端没有更新的数据,可是Browser/UA仍然须要定时的发送Get请求过来询问。那么Webserver就把曾经的老数据再传送过来。Browser/UA把这些没有变化的数据再显示出来,这样显然既浪费了网络带宽,又浪费了CPU的利用率。假设说把Browser发送Get请求的周期调大一些。就能够缓解这一问题,可是假设在Webserver端的数据更新非常快时,这样又不能保证Web应用程序获取数据的实时性。
2)long polling
它是对Polling的一种改进。
Browser/UA发送Get请求到Webserver,这时Webserver能够做两件事情,第一,假设server端有新的数据须要传送,就马上把数据发回给Browser/UA,Browser/UA收到数据后。马上再发送Get请求给Web
Server。第二,假设server端没有新的数据须要发送。这里与Polling方法不同的是,server不是马上发送回应给Browser/UA。而是把这个请求保持住,等待有新的数据到来时,再来响应这个请求。当然了。假设server的数据长期没有更新,一段时间后。这个Get请求就会超时,Browser/UA收到超时消息后。再马上发送一个新的Get请求给server。然后依次循环这个过程。
这种方式尽管在某种程度上减小了网络带宽和CPU利用率等问题。可是仍然存在缺陷,比如如果server端的数据更新速率较快。server在传送一个数据包给Browser后必须等待Browser的下一个Get请求到来,才干传递第二个更新的数据包给Browser,那么这种话,Browser显示实时数据最快的时间为2×RTT(往返时间),另外在网络拥塞的情况下,这个应该是不能让用户接受的。
另外,因为http数据包的头部数据量往往非常大(通常有400多个字节),可是真正被server须要的数据却非常少(有时仅仅有10个字节左右),这种数据包在网络上周期性的传输,难免对网络带宽是一种浪费。
2、webSocket协议简单介绍
WebSocket协议是一种双向通信协议。它建立在TCP之上,同http一样通过TCP来数据传输。可是它和http最大的不同有两点:
1.WebSocket是一种双向通信协议,在建立连接后,WebSocketserver和Browser/UA都能主动的向对方发送或接收数据,就像Socket一样。不同的是WebSocket是一种建立在Web基础上的一种简单模拟Socket的协议。
2.WebSocket须要通过握手连接。类似于TCP它也须要client和server端进行握手连接,连接成功后才干相互通信。
这里简单说明一下WebSocket握手的过程:
当Web应用程序调用new WebSocket(url)接口时,Browser就開始了与地址为url的WebServer建立握手连接的过程。
1. Browser与WebSocketserver通过TCP三次握手建立连接,假设这个建立连接失败,那么后面的过程就不会运行。Web应用程序将收到错误消息通知。
2. 在TCP建立连接成功后,Browser/UA通过http协议传送WebSocket支持的版本。协议的字版本,原始地址,主机地址等等一些列字段给server端。
<span style="font-family:Comic Sans MS;">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 </span>
3. WebSocketserver收到Browser/UA发送来的握手请求后,假设数据包数据和格式正确,client和server端的协议版本匹配等等,就接受本次握手连接,并给出对应的数据回复。相同回复的数据包也是採用http协议传输。
<span style="font-family:Comic Sans MS;">HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat </span>
4. Browser收到server回复的数据包后。假设数据包内容、格式都没有问题的话,就表示本次连接成功,触发onopen消息,此时Web开发人员就能够在此时通过send接口想server发送数据。否则,握手连接失败,Web应用程序会收到onerror消息,而且能知道连接失败的原因。
3、websocke和http关系:
WebSocket与http协议一样都是基于TCP的,所以他们都是可靠的协议,Web开发人员调用的WebSocket的send函数在browser的实现中终于都是通过TCP的系统接口进行传输的。
WebSocket和Http协议一样都属于应用层的协议,那么他们之间有没有什么关系呢?答案是肯定的,WebSocket在建立握手连接时。数据是通过http协议传输的。正如我们上一节所示“GET/chat
HTTP/1.1”,这里面用到的仅仅是http协议一些简单的字段。可是在建立连接之后,真正的传输数据阶段是不须要http协议參与的。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
4、websocke浏览器端的api:
<span style="font-family:Comic Sans MS;">var wsServer = 'ws://localhost:8888/Demo'; //server地址,这里是ws开头。假设是安全websocke使用wss
var websocket = new WebSocket(wsServer); //创建WebSocket对象
websocket.send("hello");//向server发送消息
alert(websocket.readyState);//查看websocket当前状态
websocket.onopen = function (evt) {
//已经建立连接
};
websocket.onclose = function (evt) {
//已经关闭连接
};
websocket.onmessage = function (evt) {
//收到server消息,使用evt.data提取
};
websocket.onerror = function (evt) {
//产生异常
}; </span>
5、wbsocke服务端api说明:
由于WebSocket是一种通讯协议,须要在client(浏览器已经帮我们实现)和server端都实现该协议才干完毕WebSocket的通信。所以server端须要借助一些lib包实现。
tomcat7中websocket的消息格式:
详细能够參照tomcat7下对websocket的支持返利:http://www.aiuxian.com/article/p-228470.html
websocke前世今生的更多相关文章
- 【调侃】IOC前世今生
前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...
- [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性
回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...
- docker4dotnet #1 – 前世今生 & 世界你好
作为一名.NET Developer,这几年看着docker的流行实在是有些眼馋.可惜的是,Docker是基于Linux环境的,眼瞧着那些 java, python, node.js, go 甚至连p ...
- Atitit 智能云网络摄像机的前世今生与历史 优点 密码默认888888
Atitit 智能云网络摄像机的前世今生与历史 优点 密码默认888888 用户名admin 密码aaaaaa 网络摄像机是一种结合传统摄像机与网络技术所产生的新一代摄像机,它可以将影像通过网络传 ...
- 阿里开源消息中间件RocketMQ的前世今生-转自阿里中间件
昨天,我们将分布式消息中间件RocketMQ捐赠给了开源软件基金会Apache. 孵化成功后,RocketMQ或将成为国内首个互联网中间件在Apache上的顶级项目. 消息一出,本以为群众的反应是这样 ...
- JavaScript的前世今生
和CSS一样,JavaScript在各浏览器下并非完全一致,它所带来的兼容性问题时常困扰着我们,以至于现在“能否处理流行浏览器的兼容性问题”成为了检验一个程序员是否合格的标准之一.了解JavaScri ...
- 主成分分析PCA的前世今生
这篇博客会以攻略形式介绍PCA在前世今生. 其实,主成分分析知识一种分析算法,他的前生:应用场景:后世:输出结果的去向,在网上的博客都没有详细的提示.这里,我将从应用场景开始,介绍到得出PCA结果后, ...
- SpringMVC源码剖析(二)- DispatcherServlet的前世今生
上一篇文章<SpringMVC源码剖析(一)- 从抽象和接口说起>中,我介绍了一次典型的SpringMVC请求处理过程中,相继粉墨登场的各种核心类和接口.我刻意忽略了源码中的处理细节,只列 ...
- (转)word2vec前世今生
word2vec 前世今生 2013年,Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注.首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效 ...
随机推荐
- linux下添加用户到sudo组
#查看当前用户所属组groups #查看指定用户hiuser所属组groups hiuser #添加用户hiuser到sudo组sudo usermod -G sudo hiuser
- linux下查看doc在线帮助文件
常看到某个linux下的工具,有带有doc结尾的文件,但是新手不知道如何查看. 我一番查找,终于知道了... 比如:ipython这个软件,在ubuntu里面,有ipython-doc的一个包. 安装 ...
- Vivado使用技巧(二):封装自己设计的IP核
由 judyzhong 于 星期五, 09/08/2017 - 14:58 发表 概述 Vivado在设计时可以感觉到一种趋势,它鼓励用IP核的方式进行设计.“IP Integrator”提供了原 ...
- [na]windows2008-AD域的安装
AD域的安装 初始化设置,改计算机名字dcserver,改静态ip,改dns指向自己. dcpromo,执行后自动装了dns 安装完后检查 1.本地用户没了 2,dns指向自己 3,dns记录是否齐全 ...
- C++ string的用法
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是 ...
- CCLayer设置anchorPoint无效的问题
最近刚发现一个问题,anchorPoint这个属性虽然是属于CCNode的,但是CCLayer设置anchorPoint没有效果.CCLayer的anchorPoint被默认设定在(0, 0)位置 ...
- SpringCloud重试机制配置
SpringCloud重试retry是一个很赞的功能,能够有效的处理单点故障的问题.主要功能是当请求一个服务的某个实例时,譬如你的User服务启动了2个,它们都在eureka里注册了,那么正常情况下当 ...
- 字符设备驱动笔记——中断方式按键驱动之linux异常处理结构(四)
.中断方式获取按键值 单片机: )按键按下 )cup发生中断,跳转到异常向量入口执行 )b 函数 a.保存被中断的现场 b.执行中断处理函数 c.恢复 linux: )trap_init()函数构造异 ...
- Excel VBA 操作 Word(入门篇)
原文地址 本文的对象是:有一定Excel VBA基础,对Word VBA还没有什么认识,想在Excel中通过VBA操作Word还有困难的人. 一.新建Word引用 需要首先创建一个对 Word A ...
- 一款html5和css3实现的小机器人走路动画
之前介绍了好多款html5和css3实现的动画,今天要给大家带来一款html5和css3实现的小机器人走路动画.该实例的人物用html5绘画的,动画效果是html5和css3实现的.一起看下效果图. ...