1、什么是WebSocket?
WebSocket是应用层协议
WebSocket是基于TCP的应用层协议,用于实现项目中双向通信。
但是值得注意的是:WebSocket虽然是TCP应用层协议,但是WebSocket协议是基于HTTP协议的,需要借用到HTTP协议的一部分完成握手。
WebSocket和HTTP的区别
通信方式
WebSocket是一个持久性的协议,相对于HTTP这种非持久性协议而言。
HTTP采用的是响应式请求,及"请求-响应"的模式进行通讯。WebSocket只有在服务器和客户端第一次握手时才采用"请求-响应"的模式交互,并且通讯建立成功之后,会采用双向通信的模式进行交互,及客户端和服务端随时都能从另一端发送或接受信息,不需要再次建立请求,也正因为如此,HTTP协议的通信效率没有WebSocket高。
Websocket的作用
在聊WebSocket的作用之前,简单聊一下关于ajax轮询以及long pull。
ajax轮询
ajax的轮询原理很简单,就是客户端每隔一段时间发送请求到服务端询问是否有新消息。
场景:
客户端:有没有新消息(Request)。
服务端:没有。(Response)
客户端:有没有新消息(Request)。
服务端:没有。(Response) -loop
…(直到客户端收到新的消息)
客户端:有没有新消息。(Request)
服务端:有啦。(Response)
(轮询结束)
long pull
long pull的原理与轮询ajax比较类似,但是long pull采用的阻塞模式,没有收到消息不会去断开连接,在收到消息后会创建新的连接,周而复始。
场景:
客户端:有没有消息啊,有消息记得发给我哦。(Request)
…
服务端:有消息啦,给你。(Response)
客户端:有没有消息啊,有消息记得发给我哦。(Request) -loop
其实可以看出上面上面两种方式,服务端都是作为被动的一方,及客户端主动发送请求到客户端,客户端被动的接收请求响应,服务端没办法主动发送消息到客户端。
并且能轻松看出上面这两种方式是很消耗资源的,在请求高峰时很容易出现下例情况
场景:
客户端:有新消息吗?(Request)
服务端:当前服务繁忙,请稍后询问。(503)
客户端:有新消息吗?(Request)
服务端:当前服务繁忙,请稍后询问。(503)
重新聊回WebSocket
通过上面的两个例子,可以看出都不是最好的解决方式,一个需要更好的服务器让请求更快处理,一个需要独有的服务器做处理,才能很好解决问题。
那么WekSocket作为双向模式进行通信的方式很好的解决了上面两种方式所带来的问题。
1、资源占用更小,创建通信成功后,进行通信的头部信息更小,所以传入时的信息内容较小
2、更好的支持二进制
3、实时性更强,因为是双向通信,服务端能主动发送信息到客户端