在《接口测试开发之:一图搞懂HTTP协议与HTTPS协议的传输过程》这篇博文,小鱼分析了一下HTTP和HTTP的协议传输过程,
但是呢,没有详细的介绍WebSocket,
所以,这篇就专门来介绍WebSocket的原理及并发实战。
在介绍WebSocket的由来之前,我们先看一个例子,
客户端:你好,MM,有没有新消息(request) 服务端:没有(response) 客户端:你好,MM,有没有新消息(request) 服务端:没有(response) 客户端:你好,MM,有没有新消息(request) 服务端:没有,没有,怎么还一直问呢(response) 客户端:亲,有没有新消息(request) 服务端:有了有了,这就告诉你(response) 客户端:亲,有没有新消息(request) 服务端:又来了…没有没有(response) -loop
那么上面这个例子,就是Ajax轮询原理。
我们可以看到,Ajax轮询需要服务器有很快的处理速度和资源。而long poll需要很高的并发,也就是说同时接待客户的能力。
为了能解决这种过度消耗资源的问题,WebSocket协议就应运而生了。
WebSocket与Ajax(或XHR)的区别:
① WebSocket API 在服务器和客户算可以给定的时间范围内任意时刻,互相推送信息
② WebSocket并不限于以Ajax(或XHR)方式信息,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;
③ XHR受域的限制,而WebSocket允许跨域通信。
同样,我们还是以举例子来看WebSocket实现原理,
场景如下
客户端:你好,MM,我要建立WebSocket协议,需要的服务:chat,WebSocket;协议版本:17(HTTP Request) 服务端:OK,确认,已升级为WebSocket协议(HTTP Protocols Switched) 客户端:亲,麻烦有信息的时候,推送给我哦 服务端:OK,有消息就告诉你 服务端:消息1,巴拉巴拉一大堆 服务端:消息2,巴拉巴拉一大堆 服务端:消息3,巴拉巴拉一大堆 服务端:…有消息,一直巴拉巴拉
从上面的例子,可以看出,只要经过一次HTTP请求,就可以做到源源不断的信息传递。
这样协议也同时解决了langloop以及Ajax轮询的同步有延迟而非常消耗资源的问题。
我们所有的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后在传送给相应的Handler来处理。
简单的说,就是:我们有一个非常快速的接线员(Nginx),它负责把问题转交给相应的客服(Handler)。
接线员速度起来了,但每次都卡在客服这里(Handler),导致客服每次都要求给5星好评,但是这速度太慢,只能给1星,怎么办呢?
WebSocket就解决了这个难题,建立后,可以直接跟接线员建立持久连接,这必须5星好评。
WebSocket只需要一次HTTP握手,就可以持久通话
都说第三方库是万能的,这话没毛病。
由于request模块是基于HTTP协议的,所以如果要发送WebSocket请求,就需要安装第三方的WebSocket模块。
安装方式,必须是pip安装
pip install websocket pip install websocket-client
WebSocket语法也相当简单,发送一个WebSocket的请求连接,通道连接成功之后,可以发送消息,也可以接收消息,
代码如下:
varable = websocket.create_connection(url)
建立连接,此时的url是以ws开头
varable.send(发送内容)
发送带消息的内容,可以是字符串,也可以是列表字典。
具体需要看服务器接收什么数据
varable.recv()
接收服务器消息。
这个区别于HTTP的response的地方于:接收消息是没有超时机制的。
也就是说,一旦建立连接通道后,就会一直处理等待状态,知道接收到数据才会关闭recv()方法。
所以WebSocket相对HTTP还是简单很多,建立连接,然后发送消息和接收消息。
下一篇,就是代码实例,点击即可进入《接口并发测试之:WebSocket从原理到代码实战(二)》