注:以下内容来自网上。本人经过加工整理。

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前世今生的更多相关文章

  1. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

  2. [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性

    回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...

  3. docker4dotnet #1 – 前世今生 & 世界你好

    作为一名.NET Developer,这几年看着docker的流行实在是有些眼馋.可惜的是,Docker是基于Linux环境的,眼瞧着那些 java, python, node.js, go 甚至连p ...

  4. Atitit 智能云网络摄像机的前世今生与历史 优点  密码默认888888

    Atitit 智能云网络摄像机的前世今生与历史 优点  密码默认888888 用户名admin  密码aaaaaa 网络摄像机是一种结合传统摄像机与网络技术所产生的新一代摄像机,它可以将影像通过网络传 ...

  5. 阿里开源消息中间件RocketMQ的前世今生-转自阿里中间件

    昨天,我们将分布式消息中间件RocketMQ捐赠给了开源软件基金会Apache. 孵化成功后,RocketMQ或将成为国内首个互联网中间件在Apache上的顶级项目. 消息一出,本以为群众的反应是这样 ...

  6. JavaScript的前世今生

    和CSS一样,JavaScript在各浏览器下并非完全一致,它所带来的兼容性问题时常困扰着我们,以至于现在“能否处理流行浏览器的兼容性问题”成为了检验一个程序员是否合格的标准之一.了解JavaScri ...

  7. 主成分分析PCA的前世今生

    这篇博客会以攻略形式介绍PCA在前世今生. 其实,主成分分析知识一种分析算法,他的前生:应用场景:后世:输出结果的去向,在网上的博客都没有详细的提示.这里,我将从应用场景开始,介绍到得出PCA结果后, ...

  8. SpringMVC源码剖析(二)- DispatcherServlet的前世今生

    上一篇文章<SpringMVC源码剖析(一)- 从抽象和接口说起>中,我介绍了一次典型的SpringMVC请求处理过程中,相继粉墨登场的各种核心类和接口.我刻意忽略了源码中的处理细节,只列 ...

  9. (转)word2vec前世今生

    word2vec 前世今生 2013年,Google开源了一款用于词向量计算的工具——word2vec,引起了工业界和学术界的关注.首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效 ...

随机推荐

  1. linux中计划任务执行脚本

    我使用的是ubuntu14.4,所以在ubuntu中一切正常,在其他linux系统中应该都差不多. 1 计划任务,crontab命令选项:     -u指定一个用户,     -l列出某个用户的任务计 ...

  2. 2. 解题报告~买卖股票的最佳时机 II

    原题地址:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/1/array/22/ 给定一个数组, ...

  3. jvm 性能调优 经验总结---转

    最近因项目存在内存泄漏,故进行大规模的JVM性能调优 , 现把经验做一记录. 一.JVM内存模型及垃圾收集算法 1.根据Java虚拟机规范,JVM将内存划分为: New(年轻代) Tenured(年老 ...

  4. 网络编程----------SOCKET编程实现简单的TCP协议

    首先我们须要大致了解TCP的几点知识: 1.TCP的特点:面向连接的可靠性传输 2.TCP的三次握手建立连接和四次挥手释放连接.但为什么TCP要三次握手建立连接呢? 答:由于两次握手无法保证可靠性.若 ...

  5. rabbitmq 基本信息

    两个或多个系统间需要通过定时任务来同步数据,异构系弘的不同进程间想互调用 通讯的问题,可以用rabbitmq解决.rabbitmq擅长解决多系统 异构系统音的数据交换,也可以用于系统间服务的相互调用R ...

  6. javascript原生bind方法ie低版本兼容详解

    上一篇文章讲到了javascript原生的bind方法: http://www.cnblogs.com/liulangmao/p/3451669.html 这篇文章就在理解了原生bind方法的原理以后 ...

  7. 每日英语:Genetic Manipulation Extends Life of Mice 20%

    By reducing the activity of one type of gene, scientists said they increased the average life span o ...

  8. spark结构化数据处理:Spark SQL、DataFrame和Dataset

    本文讲解Spark的结构化数据处理,主要包括:Spark SQL.DataFrame.Dataset以及Spark SQL服务等相关内容.本文主要讲解Spark 1.6.x的结构化数据处理相关东东,但 ...

  9. USB设备驱动程序学习笔记(二)

    一.usbmouse_as_key.c /* * drivers\hid\usbhid\usbmouse.c */ #include <linux/kernel.h>#include &l ...

  10. 【转】kafka&zookeeper集群搭建指南

    [转自]:http://www.cnblogs.com/luotianshuai/p/5206662.html 待续...