WebSocket存在的意义
初期html的出现刚开始是静态的,无法进行交互,后来出现了JavaScript,一定程度上解决了该问题,JavaScript刚出现的时候不能和服务器端交互,直到Ajax出现。Ajax可以讲就是一个解决页面与服务器端进行交互的工具。而Ajax的所有请求都是必须由客户端发起的,服务器端进行响应。如果是服务器端有了新的消息,难以即时的发送到客户端。WebSocket技术出现之前,为了让客户端获取服务器端的数据,一般采用如下三种方案。
轮询
这种方法最为简单,就是客户端在固定的时间间隔下(一般是1s)不停地向服务器端发出请求,查看客户端是否有最新的数据,服务器端如果有最新的数据则返回给客户端,如果没有则返回一个空的json或者xml文档。这种方式的实现很简单,但是弊端就是不停的发送无效请求,造成了服务器资源的浪费。
长连接
长连接类似轮询,区别就是服务器端只有存在新数据时,才会响应客户端的请求,这样可以节约网络资源和服务器端资源,当然这种方法也存在一些问题:
1.如果浏览器在服务器响应之前有新数据要发送就只能创建一个新的并发请求,或者先尝试断掉当前请求然后再创建新的请求。
2.TCP和HTTP规范中都有连接超时一说,所以所谓的长连接不能一直持续,服务器端和客户端的连接需要定期的连接和关闭再连接,当然也有一些技术能够延长每次连接的时间。
Applet和Flash
Applet和flash的缺点:
1.浏览器必须能够运行Java或者Flash
2.无论是Applet还是Flash都存在安全问题
3.随着HTML5在标准浏览器中广发支持,Flash下架已经被提上日程。(2020年停止支持)
WebSocket有哪些特点
webSocket可以实现全双工通信(服务器与浏览器之间)
HTTP/1.1的升级特性
事实上,所有的HTTP客户端(浏览器、移动端等)都可以在请求头中包含Connection:Upgrade,这个表示客户端希望希望升级请求协议,那么是希望升级成什么样的呢?
Http升级的最大的好处是最终使我们可以使用任意的协议,在升级握手完成之后,它就不再使用HTTP连接了,我们可以在升级握手完成之后建立一个Socket连接,理论上我们可以使用HTTP升级在两个端点之间使用任何自己设计的协议,进而创建出各种各样的TCP通信,当然浏览器不会让开发者随意去这么做,而是要指定某些协议,WebSocket应运而生。
使用HTTP/1.1升级的WebSocket协议
一个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协议的优势
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协议的用途几乎是没有限制的:
1.网页上的在线聊天
2.多人在线游戏
3.在线股票网站
4.在线即时新闻网站
5.高清视频流
6.应用集群之间的通信