websocket的应用
1.什么是websocket?
websocket是一种在单个TCP连接上进行的全双工通信协议。
websocket使得server端和client端之间的数据交互变得更加容易。
在Websocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
目前,很多网站为了实现推送技术,使用的都是轮询技术,即过一段时间(1MS)向服务端发送HTTP请求。这种轮询方式很浪费资源。
2.在Django中实现websocket
在django中实现websocket主要有两种方式:(1)借助channels;(2)使用dwebsocket;
第一种借助channels依赖于redis、twisted等。
3.安装 dwebsocket
pip install dwebsocket
4.配置
(1)注册APP
INSTALLED_APPS = [
...
'app01.apps.App01Config',
'rest_framework', # DRF框架
'dwebsocket', # websocket
]
(2)为所有的URL提供websocket(可选步骤)
MIDDLEWARE_CLASSES = [
......
......
'dwebsocket.middleware.WebSocketMiddleware' # 为所有的URL提供websocket,如果只是单独的视图需要可以不选
]
(3)允许每个单独的视图使用websocket
WEBSOCKET_ACCEPT_ALL=True # 可以允许每一个单独的视图实用websockets
5.使用
views.py
from django.shortcuts import render
from dwebsocket.decorators import accept_websocket
# Create your views here.
def login(request,*args,**kwargs):
return render(request,'login.html')
@accept_websocket
def send_message(request,*args,**kwargs):
if request.is_websocket():
request.websocket.send('博主真NB'.encode('utf-8'))
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="content-type" charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>NB</title>
</head>
<body>
<button onclick="WebSocketTest()">test</button>
</body>
<script>
function WebSocketTest() {
alert(1);
if ("WebSocket" in window) {
alert("您的浏览器支持 WebSocket!");
// 打开一个 web socket
ws = new WebSocket("ws://127.0.0.1:8000/path/");
ws.onopen = function () {
// Web Socket 已连接上,使用 send() 方法发送数据
ws.send("发送数据");
alert("数据发送中...");
};
ws.onmessage = function (evt) {
var received_msg = evt.data;
alert("数据已接收...");
alert("数据:" + received_msg)
};
ws.onclose = function () {
// 关闭 websocket
alert("连接已关闭...");
};
}
else {
// 浏览器不支持 WebSocket
alert("您的浏览器不支持 WebSocket!");
}
}
</script>
</html>
6.详解
#dwebsocket有两种装饰器:require_websocket和accept_websocekt,使用require_websocket装饰器会导致视图函数无法接收导致正常的http请求,一般情况使用accept_websocket方式就可以了,
#
# dwebsocket的一些内置方法:
#
# request.is_websocket():判断请求是否是websocket方式,是返回true,否则返回false
# request.websocket: 当请求为websocket的时候,会在request中增加一个websocket属性,
# WebSocket.wait() 返回客户端发送的一条消息,没有收到消息则会导致阻塞
# WebSocket.read() 和wait一样可以接受返回的消息,只是这种是非阻塞的,没有消息返回None
# WebSocket.count_messages()返回消息的数量
# WebSocket.has_messages()返回是否有新的消息过来
# WebSocket.send(message)像客户端发送消息,message为byte类型