HTTP 和 WebSocket

HTTP 和 WebSocket

fetch150zy

既然有 HTTP 协议,为什么还要有 WebSocket

使用 HTTP 不断轮训

怎么样才能在用户不做任何操作的情况下,网页能收到消息并发生变更

最常见的解决方案是,网页的前端代码里不断定时发 HTTP 请求到服务器,服务器收到请求后给客户端响应消息

长轮训

我们知道,HTTP 请求发出后,一般会给服务器留一定的时间做响应,规定时间内没返回,就认为是超时

如果我们的 HTTP 请求将超时设置的很大,比如 30 秒,在这 30 秒内只要服务器收到了扫码请求,就立马返回给客户端网页。如果超时,那就立马发起下一次请求

这样就减少了 HTTP 请求的个数,并且由于大部分情况下,用户都会在某个 30 秒的区间内做扫码操作,所以响应也是及时的

图片

对于这种简单场景上面这些方法还能用,但如果是网页游戏等有大量数据需要从服务器主动推送到客户端?

WebSocket

TCP 连接的两端,同一时间里双方都可以主动向对方发送数据,这就是所谓的全双工

而现在使用最广泛的HTTP/1.1,也是基于TCP协议的,同一时间里,客户端和服务器只能有一方主动发数据,这就是所谓的半双工

WebSocket 和 socket 之间几乎没有任何关系

图片

由上图可知,WebSocket和HTTP一样都是基于TCP的协议。经历了三次TCP握手之后,利用 HTTP 协议升级为 WebSocket 协议