年初的时候,写过两篇博客介绍在Spring Boot中如何使用WebSocket发送消息【在Spring Boot框架下使用WebSocket实现消息推送】【在Spring Boot框架下使用WebSocket实现聊天功能】,最近看到很多小伙伴对WebSocket的讨论还比较火热,so,打算写几篇文章来系统的介绍下websocket。OK,废话不多说,下面开始我们的正文。


为什么要有WebSocket这个技术

大家都知道,HTML页面在刚刚开始出现的时候是静态的,不能够进行交互,后来有了JavaScript,在一定程度上解决了这个问题,但是JavaScript刚出现的时候并不能和服务端进行交互,直到Ajax的出现。Ajax有效的解决了页面和服务端进行交互的问题,不过Ajax有一个问题,就是所有的请求都必须由客户端发起,服务端进行响应,如果服务端有最新的消息,难以即时的发送到客户端去,在WebSocket技术出现之前,为了让客户端能够即时的获取服务端的数据,一般采用如下三种方案:

轮询

这是最简单的一种解决方案, 就是客户端在固定的时间间隔下(一般是1秒)不停的向服务器端发送请求,查看服务端是否有最新的数据,服务端如果有最新的数据则返回给客户端,服务端如果没有则返回一个空的json或者xml文档,这种方式的实现起来简单,但是弊端也很明显,就是会有大量的无效请求,服务端的资源被大大的浪费了。

长连接

长连接有点类似于轮询,不同的是服务端不是每次都会响应客户端的请求,只有在服务端有最新数据的时候才会响应客户端的请求,这种方式很明显会节省网络资源和服务端资源,但是也存在一些问题,比如:

1.如果浏览器在服务器响应之前有新数据要发送就只能创建一个新的并发请求,或者先尝试断掉当前请求然后再创建新的请求。

2.TCP和HTTP规范中都有连接超时一说,所以所谓的长连接并不能一直持续,服务端和客户端的连接需要定期的连接和关闭再连接,当然也有一些技术能够延长每次连接的时间,这是题外话。

Applet和Flash

Applet和Flash都已经是明日黄花了,不过这两个技术在当年除了可以让我们的HTML页面更加绚丽之外,还可以解决消息推送问题。在Ajax这种技术去实现全双工通信已经陷入困境的时候,开发者试图用Applet和Flash来模拟全双工通信,开发者可以创建一个只有1个像素点大小的普通透明的Applet或者Flash,然后将之内嵌在页面中, 然后这个Applet或者Flash中的代码创建出一个Socket连接,这种连接方式消除了HTTP协议中的各种限制,当服务器有消息发送到客户端的时候,开发者可以在Applet或者Flash中调用JavaScript函数,并将服务器传来的消息传递给JavaScript函数,然后更新页面,当浏览器有数据要发送给服务器的时候,也一样,通过Applet或者Flash来传递。这种方式真正的实现了全双工通信,不过也有问题,如下:

1.浏览器必须能够运行Java或者Flash

2.无论是Applet还是Flash都存在安全问题

3.随着HTML5在标准在浏览器中广泛支持,Flash下架已经被提上日程(终于要放弃,Adobe宣布2020年正式停止支持Flash)

WebSocket有哪些特点

既然上面这些技术都不行,那么谁行?当然是我WebSocket了!

HTTP/1.1的升级特性

要说WebSocket协议,我们得先来说说HTTP协议的一个请求头,事实上,所有的HTTP客户端(浏览器、移动端等)都可以在请求头中包含Connection:Upgrade,这个表示客户端希望升级请求协议,那么希望升级成什么样的协议呢?我们需要在Upgrade头中指定一个或者多个协议的列表,当然这些协议必须兼容HTTP/1.1协议。服务器收到请求之后,如果接受升级请求,那么将会返回一个101的状态码,表示转换请求协议,同时在响应的Upgrade头中使用单个值,这个单个值就是请求协议列表中服务器支持的第一个协议(即请求头的Upgrade字段中列出来的协议列表中服务器支持的第一个协议)。

HTTP升级最大的好处是最终使我们可以使用任意的协议,在升级握手完成之后,它就不再使用HTTP连接了,我们甚至可以在升级握手完成之后建立一个Socket连接,理论上我们可以使用HTTP升级在两个端点之间使用任何自己设计的协议,进而创建出各种各样的TCP通信,当然浏览器不会让开发者随意去这么做,而是要指定某些协议,WebSocket应运而生!

我们来看一个截图:

使用HTTP/1.1升级的WebSocket协议

OK,了解了HTTP/1.1协议的升级特性之后,我们再来详细看看整个过程是怎么样的?

一个WebSocket请求首先使用非正常的HTTP请求以特定的模式访问一个URL,这个URL有两种模式,分别是ws和wss,对应HTTP协议中的http和https,请求头中除了Connection:Upgrade之外还有一个Upgrade:websocket,它们两个将共同告诉服务器将连接升级为WebSocket这样一种全双工协议。如此,在握手完成之后,文本消息或者其他二进制消息就可以同时在两个方向上进行发送,而不需要关闭和重建连接。此时的客户端和服务端关系其实是对等的,他们都可以互相向对方主动发消息。那么这里有一点需要注意:那就是ws和wss模式并不能算作HTTP协议的一部分,因为HTTP请求和请求头并不包含URL模式,HTTP请求只在请求的第一行中包含相对于服务器的URL,在Host头中包含域名,而WebSocket中特有的ws和wss模式主要用于通知浏览器和API是希望使用SSL/TLS(wss),还是希望使用不加密的方式(ws)进行连接。

WebSocket协议的优势

说了这么多,那么接下来我们来看看WebSocket协议都有哪些优势:

1.由于WebSocket连接在端口80(ws)或者443(wss)上创建,与HTTP使用的端口相同,这样,基本上所有的防火墙都不会阻塞WebSocket连接

2.WebSocket使用HTTP协议进行握手,因此它可以自然而然的集成到网络浏览器和HTTP服务器中

3.心跳消息(ping和pong)将被反复的发送,进而保持WebSocket连接几乎一直处于活跃状态。一般来说是这样,一个节点周期性的发送一个小数据包到另外一个节点(ping),而另一个节点则使用了包含了相同数据的数据包作为响应(pong),这样两个节点都将处于连接状态

4.使用该协议,当消息启动或者到达的时候,服务端和客户端都可以知道

5.WebSocket连接关闭时将发送一个特殊的关闭消息

6.WebSocket支持跨域,可以避免Ajax的限制

7.HTTP规范要求浏览器将并发连接数限制为每个主机名两个连接,但是当我们使用WebSocket的时候,当握手完成之后该限制就不存在了,因为此时的连接已经不再是HTTP连接了

WebSocket协议的用途

说了这么多那么WebSocket协议到底可以用在哪些地方呢?事实上,WebSocket协议的用途几乎是没有限制的,比如:

1.网页上的在线聊天

2.多人在线游戏

3.在线股票网站

4.在线即时新闻网站

5.高清视频流

6.应用集群之间的通信

7.远程系统/软件的状态和性能的实时监控

结语

说了这么多,可能很多小伙伴觉得这个WebSocket貌似用起来很麻烦,其实不麻烦,所有的东西都有对应的API来帮助我们实现,小伙伴们稍安勿躁,我们将在下篇文章中来介绍WebSocket的实战应用。

参考资料:《JavaEE 编程》

更多JavaEE资料请关注公众号

以上。

WebSocket刨根问底(一)的更多相关文章

  1. WebSocket刨根问底(四)之五子棋大战江湖

    有暇,做了个五子棋大战的小游戏送给各位小伙伴! 用到的知识点有: 1.JavaWeb基础知识(懂jsp,servlet足够) 2.JavaScript和jQuery基本用法 3.了解WebSocket ...

  2. WebSocket刨根问底(三)之群聊

    前两篇文章[WebSocket刨根问底(一)][WebSocket刨根问底(二)]我们介绍了WebSocket的一些基本理论,以及一个简单的案例,那么今天继续,我们来看一个简单的群聊的案例,来进一步了 ...

  3. WebSocket刨根问底(二)

    上篇文章[WebSocket刨根问底(一)]中我们对WebSocket的一些基本理论进行了介绍,但是并没有过多的涉及到一些实战的内容,今天我希望能够用几个简单的案例来向小伙伴们展示下WebSocket ...

  4. 刨根问底 HTTP 和 WebSocket 协议(上)

    HTTP vs WebSocket 那天和boss聊天,不经意间提到了Meteor,然后聊到了WebSocket,然后就有了以下对话,不得不说,看问题的方式不同,看到的东西也会大不相同. A:Mete ...

  5. 刨根问底HTTP和WebSocket协议

    HTML5的新成员:WebSocket 上篇介绍了HTTP1.1协议的基本内容,这篇文章将继续分析WebSocket协议,然后对这两个进行简单的比较. WebSocket WebSocket协议还很年 ...

  6. 刨根问底 HTTP 和 WebSocket 协议(下)

    上篇介绍了HTTP1.1协议的基本内容,这篇文章将继续分析WebSocket协议,然后对这两个进行简单的比较. WebSocket WebSocket协议还很年轻,RFC文档相比HTTP的发布时间也很 ...

  7. 网页实时聊天之PHP实现websocket

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  8. 八问WebSocket协议:为你快速解答WebSocket热门疑问

    一.引言 WebSocket是一种比较新的协议,它是伴随着html5规范而生的,虽然还比较年轻,但大多主流浏览器都已经支持.它使用方面.应用广泛,已经渗透到前后端开发的各种场景中. 对http一问一答 ...

  9. android中的websocket 应用

    websocket 在实际的应用中不仅仅能做聊天应用,还可以利用websocket长连接保持数据的实时更新以及信息的推送. websocket 的实现的关键点 第一个:首先需要引入 java-webs ...

随机推荐

  1. selenium操作浏览器的前进和后退

    前进关键字:driver.forward() 后退关键字:driver.back() 测试对象:1.https://www.baidu.com/ 2.https://www.sogou.com/ 实例 ...

  2. Navicat Premium 12.1.12.0安装与激活

    转载自:Navicat Premium 12.1.12.0安装与激活 作者:丿记忆灬永殇丨 链接:https://www.jianshu.com/p/5f693b4c9468 navicat12112 ...

  3. linux 使用技巧 screen 管理你的远程桌面的会话创建和使用

    下面介绍  screen 使用的技巧教你管理远程会话 你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份. ftp 传 ...

  4. pythonpipinstallpymongo报错

    1.安装pymongo模块,报错pip版本低,升级版本又报错找不到合适的版本,网友说网络问题,要使用国内的镜像源来加速:pip install pymongo -i http://pypi.douba ...

  5. QEMU, a Fast and Portable Dynamic Translator-Fabrice Bellard-翻译

    Abstract We present the internals of QEMU, a fast machine emulator using an original portable dynami ...

  6. LocalDate、LocalDateTime、LocalTime开发小结

    在我之前的文章<[整理]Java 8新特性总结 >中有提到Date/Time API (JSR 310)对日期与时间的处理.它将服务端对时间的处理进行了统一,使得对时间的处理更加规范和统一 ...

  7. 12-JSP&EL&JSTL

    JSP & EL & JSTL jsp Java Server Page 什么是jsp 从用户角度看待 ,就是是一个网页 , 从程序员角度看待 , 其实是一个java类, 它继承了se ...

  8. phantomjs api文档

    phantomjs实现了一个无界面的webkit浏览器.虽然没有界面,但dom渲染.js运行.网络访问.canvas/svg绘制等功能都很完备,在页面抓取.页面输出.自动化测试等方面有广泛的应用. 详 ...

  9. ECS云服务器配置数据库远程链接

    环境: windows server 2012 R2 Datacenter(数据中心版本) sql server 2008 R2 Express (环境的安装步骤此处不做教程) 开启远端链接重要步骤如 ...

  10. R语言grid包just参数如何just图形位置

    思路   grid的画图函数都含有just,但是just参数的是怎么调节图形位置的总是让人非常费解,于是便写了代码来一探究竟.   思路非常简单:放一个2*2的布局viewport,每个布局里面放一个 ...