通俗易懂解说websocket

一、为什么需要websocket

HTTP 协议有一个缺陷:通信只能由客户端发起。(HTTP协议的单向性)举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。而且HTTP是一个无状态协议。通俗的说就是,服务器因为每天要接待太多客户了,是个健忘鬼,你一挂电话,他就把你的东西全忘光了,把你的东西全丢掉了。你第二次还得再告诉服务器一遍。因此WebSocket 就是这样发明的。WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。在WebSocket API中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。这样就解决了http协议无法由服务器主动向客户端发信息的缺点啦。

二、websocket简介

Websocket是一个持久化的协议,而HTTP是非持久化协议。

HTTP的生命周期通过Request(请求)来界定,也就是一个Request(请求) 一个Response(响应),那么在HTTP1.0中,这次HTTP请求就结束了。

在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request(请求),接收多个Response(响应)。

但是请记住请求个数一定等于响应个数 , 在HTTP中永远是这样,也就是说一个请求只能有一个响应。而且这个响应也是被动的,不能主动发起。

websocket的连接是基于HTTP协议的,在建立一个 WebSocket 连接时,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些信息表示这是一个websocket连接,服务器端解析这些附加的信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。

websocket的协议标识符是ws(如果加密,则为wss),就像http对应的加密协议就是https啦

三、通俗易懂了解http和websocket区别

http主要通过两种方式进行服务器与客户端信息交互,一种是ajax轮询,一种是长轮询(long poll)

1、首先是ajax轮询,客户端不断发送请求给服务器

客户端:啦啦啦,有没有新信息(Request)

服务端:没有(Response)

客户端:啦啦啦,有没有新信息(Request)

服务端:没有(Response)

客户端:啦啦啦,有没有新信息(Request)

服务端:你好烦啊,没有啊(Response)

客户端:啦啦啦,有没有新消息(Request)

服务端:好啦好啦,有啦给你。(Response)

客户端:啦啦啦,有没有新消息(Request)

服务端:没。。没。。没有(Response)

2、长轮询:客户端发起连接后,如果没消息,就一直不返回Response给客户端。直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。

客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)

服务端:额。。 等待到有消息的时候。。来 给你(Response)

客户端:啦啦啦,有没有新信息,没有的话就等有了才返回给我吧(Request)

3、当http协议升级为websocket时,服务端就能主动给客户端发送信息啦

客户端:啦啦啦,我要建立Websocket协议(HTTP Request)

服务端:ok,确认,已升级为Websocket协议(HTTP Protocols Switched)

客户端:麻烦你有信息的时候推送给我噢。。

服务端:ok,有的时候会告诉你的。

服务端:balabalabalabala

服务端:balabalabalabala

服务端:哈哈哈哈哈啊哈哈哈哈

服务端:哈哈哈哈哈哈哈

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180618G0VSK200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券