前言
这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
Websocket
WebSocket
实现了浏览器与服务器的全双工通信,扩展了浏览器与服务端的通信功能,使服务端可以主动向客户端发送数据。
传统的HTTP
协议是无状态的,种客户端是主动方,服务端是被动方的;对于涉及实时信息的Web
应用带来了很大的不便,如带有即时通信、实时数据、订阅推送等功能的应用。在之前有两种办法解决这个问题
轮询是最原始的实现实时Web
应用的解决方案。轮询技术要求客户端以设定的时间间隔周期性地向服务端发送请求,频繁地查询是否有新的数据改动。这种方法会导致过多不必要的请求,浪费流量和服务器资源。
Comet
技术又可以分为长轮询和流技术;长轮询改进了上述的轮询技术,减小了无用的请求。它会为某些数据设定过期时间,当数据过期后才会向服务端发送请求;这种机制适合数据的改动不是特别频繁的情况。流技术通常是指客户端使用一个隐藏的窗口与服务端建立一个HTTP
长连接,服务端会不断更新连接状态以保持HTTP
长连接存活;这样的话,服务端就可以通过这条长连接主动将数据发送给客户端;流技术在大并发环境下,可能会考验到服务端的性能。
WebSocket
真正实现了Web
的实时通信,使B/S
模式具备了C/S
模式的实时通信能力
WebSocket
的工作流程是这样的:浏览器通过JavaScript
向服务端发出建立WebSocket
连接的请求,在WebSocket
连接建立成功后,客户端和服务端就可以通过 TCP连接传输数据。因为WebSocket
连接本质上是TCP
连接,不需要每次传输都带上重复的头部数据,所以它的数据传输量比轮询和Comet
技术小了很多
Websocket
在建立连接之前有一个Handshake
(Opening Handshake
)过程,在关闭连接前也有一个Handshake(Closing Handshake
)过程,建立连接之后,双方即可双向通信
HTML的Websocket
- 初始化websocket
var ws = new WebSocket(url, [protocol] );
url
:指定连接的websocket
protocol
:可接受的子协议
响应事件
当
ws
套接字初始化成功之后,我们可以通过定义回调函数在某些事件触发时执行,以下是常见响应事件
- 当
ws
连接建立时触发
ws.onopen = function(){
// 连接开启
}
- 当
ws
连接接收到数据时触发
ws.onmessage = function(evt){
// evt.data即是接收到的数据对象
}
- 当
ws
连接发生通信错误时触发
ws.onerror = function(){
// 连接出错
}
- 当连接关闭时触发
ws.onclose = function(){
// 连接关闭
}
初次之外,还可以通过一些方法函数进行数据的传输或连接的关闭
方法
- 通过
ws
连接发送数据
ws.send(str)
- 关闭连接
ws.close()
示例
var ws = new WebSocket('ws://127.0.0.1:3000')
ws.onopen = function(){
console.log('连接建立')
}
ws.onmessage = function(ev){
console.log('server:',ev.data)
}
ws.onerror = function(){
console.log('连接建立')
ws.close()
}
ws.onclose = function(){
console.log('连接关闭')
ws.close()
}
Django的Websocket
dwebsocket
是一个在django
用来实现websocket
服务端的三方模块,使用上手非常简单,安装方式如下
pip install dwebsocket
git
地址
https://github.com/duanhongyi/dwebsocket
方法
在后台中,通过该三方模块可以让我们在
django
的视图中实现对于websocket
的操作
首先是两个基本的装饰器,用来限定过滤
websocket
的连接
dwebsocket.accept_websocket
允许
http
与websocket
连接
dwebsocket.require_websocke
只允许
websocket
连接
除去两种装饰器方法进行过滤判断,还可以通过在视图函数中的
request
进行websocket
的判断
request.is_websocket
如果是个
websocket
请求返回True
,如果是个普通的http
请求返回False
可以用这个方法区分普通连接与
websocket
request.websocket
在一个
websocket
请求建立之后,这个请求将会有一个websocket
属性,用来给客户端提供一个简单的api
通讯,如果request.is_websocket()
是False
,这个属性将是None
request.websocket.wait
接收客户端发来的一条消息;如果在收到消息或客户端关闭连接之前,它不会有任何返回,只会返回None
request.websocket.read
如果从客户端接收到新消息,
read
函数返回这条消息;如果没有新消息,则返回None这是一个替代
wait
的非阻塞读取数据的方法
request.websocket.count_messages()
返回消息队列数量
request.websocket.has_messages()
如果有新消息返回
True
,否则返回False
request.websocket.send(message)
向客户端发送消息
requqest.websocket.__iter__