1. Ajax轮询
使用ajax异步的每隔一段时间向后端发送一次请求,询问服务器有没有新的消息或者新的状态更新,如果有则返回给前端。因为这种方式其实是一种死循环,所以需要服务器有很快的处理速度和资源。
大概就是下面这样的情况
客户端:有新消息吗?(Request)
服务端:没有(Response)
客户端:有新消息吗?(Request)
服务端:没有(Response)
客户端:有新消息吗?(Request)
服务端:没有!你好烦!(Response)
客户端:有新消息吗?(Request)
服务端:你有病吧(Response)
客户端:有新消息吗?(Request)
服务端:有了,拿走。。。(Response)
客户端:有新消息吗?(Request)
服务端:没有。。。(Response)
2. Long pull
原理和Ajax轮询差不多,只不过他使用的是一种阻塞的模式。当客户端发起请求后,如果服务端没有响应,那么就会一直阻塞着。只有在服务端返回后,才会再次建立请求,周而复始。因为使用的是阻塞的模式,所以需要有很高的并发。
大概就是下面这样的情况
客户端:有新消息吗?没有你也不准挂,等到有新消息了立马告诉我(Request)
服务端:好吧,那就一直连接着。。。终于有新消息了,来,给你(Response)
客户端:有新消息吗?没有你也不准挂,等到有新消息了立马告诉我(Request)
服务端:好吧,那就一直连接着。。。终于有新消息了,来,给你(Response)
......
以上的两种方式都是在不停的建立HTTP连接,等待服务器处理。这是一种被动的响应,是比较消耗资源的。(这其实就是HTTP的一个特点:被动性,服务端不能主动联系客户端,只能有客户端发起。)
3. WebSocket
WebSocket其实就是基于HTTP的一种协议,或者说就是使用HTTP协议来实现一部分的握手。客户端发起请求到服务端,找到服务端的服务助理,服务助理会和客户端保持连接,并且可以主动的推送消息给客户端。Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中。
WebSocket 的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话(不同于HTTP的被动性)。
大概是以下这样的场景:
客户端:我要建立Websocket协议。
服务端:好的,建立Websocket协议。
客户端:麻烦有新消息的时候告诉我哦_
服务端:好的。
服务端:有新消息了,来,给你。
WebSocket协议具有以下特点:
- 建立在 TCP 协议之上,服务器端的实现比较容易。
- 与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
- 数据格式比较轻量,性能开销小,通信高效。
- 可以发送文本,也可以发送二进制数据。
- 没有同源限制,客户端可以与任意服务器通信。
- 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。
网友评论