websocket协议

文档:https://tools.ietf.org/html/rfc6455

一直以来,HTTP是无状态、单向通信的网络协议,即客户端请求一次,服务器回复一次,默认情况下,只允许浏览器向服务器发出请求后,服务器才能返回相应的数据。如果想让服务器消息及时下发到客户端,需要采用类似于轮询的机制,大部分情况就是客户端通过定时器使用ajax频繁地向服务器发出请求。这样的做法效率很低,而且HTTP数据包头本身的字节量较大,浪费了大量带宽和服务器资源。

为了提高效率,HTML5推出了WebSocket技术。

WebSocket是一种让客户端和服务器之间能进行全双工通信(full-duplex)的技术。它是HTML最新标准HTML5的一个协议规范,本质上是个基于TCP的应用层协议,它通过HTTP/HTTPS协议发送一条特殊的握手请求进行握手后创建了一个TCP连接,此后浏览器/客户端和服务器之间便可随时随地以通过此连接来进行双向实时通信,且交换的数据包头信息量很小。

同时为了方便使用,HTML5提供了非常简单的操作就可以让前端开发者直接实现websocket通信,开发者只需要在支持WebSocket的浏览器中,创建webSocket对象之后,通过onopen、onmessage、onclose、onerror四个事件的实现即可处理webSocket的请求响应。

注意:websocket是HTML5技术的一部分,但是websocket并非只能在浏览器或者HTML文档中才能使用,事实上在python或者C++等语言中只要能实现websocket协议报文,均可使用。

导读:https://blog.csdn.net/zhusongziye/article/details/80316127

客户端报文:

GET /mofang/websocket HTTP/1.1
Host: 127.0.0.1
Origin: http://127.0.0.1:5000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==     # Sec-WebSocket-Key 是基于SHA-1随机生成的
Sec-WebSocket-Version: 13

服务端报文:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= # 结合客户端提供的Sec-WebSocket-Key基于固定算法计算出来的
Sec-WebSocket-Protocol: chat

 

WebSocket与Socket的关系

他们两的关系就像Java和JavaScript,并非完全没有关系,只能说有点渊源。

Socket严格来说,其实并不是一个协议,而是为了方便开发者使用TCP或UDP协议而对TCP/IP协议进行封装出来的一组接口,是位于应用层和传输控制层之间的接口。通过Socket接口,我们可以更简单,更方便的使用TCP或UDP通信。

WebSocket是实现了浏览器与服务器的全双工通信协议,一个模拟Socket的新型应用层协议。

 

服务端基于socket提供服务

在python中实现socket服务端的方式有非常多,一种最常用的有python-socketio,而我们现在使用的flask框架也有一个基于python-socket模块进行了封装的flask-socketio模块.

官方文档:https://flask-socketio.readthedocs.io/en/latest/

注意:

因为目前还有会存在一小部分的设备或者应用是不支持websocket的.所以为了保证功能的可用性,我们使用socktio模块,但是由此带来了2个问题,必须要注意的:

  1. python服务端使用基于socketio进行通信服务,则另一端必须也是基于socketio来进行对接通信,否则无法进行通信

  2. socketio在使用上还有一个版本对应的问题, 版本不对应则无法通信.回报版本错误.

    如果使用了javascript版本socketio 1.x或者2.x版本,则python-socketio或者flask-socketio的版本必须是4.x

    如果使用了javascript版本socketio 3.x版本, 则python-socketio或者flask-socketio的版本必须是5.x.

 

终端下执行命令,安装:

pip install flask-socketio
pip install -U flask-cors
# 方案1
pip install eventlet
# 方案2
# pip install gevent
# pip install gevent-websocket

我们当前使用的flask-socketio版本是5.x,所以记住javasctipt的socketio版本就必须是3.x.

 

posted @ 2021-12-16 15:38  urls  阅读(135)  评论(0编辑  收藏  举报