pythonwebsocketDjango实时消息推送
概述:
WebSocket 是什么?
WebSocket 是 HTML5 提供的⼀种浏览器与服务器间进⾏全双⼯通讯的协议。依靠这种协议可以实现客户端和服务器端,⼀次握⼿,双向实时通信。
WebSocket 服务端:
⽤的是 dwebsocket,安装命令pip install dwebsocket.
WebSocket 基本⽅法:
如果是个websocket请求返回True,如果是个普通的http请求返回False,可以⽤这个⽅法区分它们。
在⼀个websocket请求建⽴之后,这个请求将会有⼀个websocket属性,⽤来给客户端提供⼀个简单的api通讯,如果
request.is_websocket()是False,这个属性将是None。
3.WebSocket.wait()
返回⼀个客户端发送的信息,在客户端关闭连接之前他不会返回任何值,这种情况下,⽅法将返回None
ad()
如果没有从客户端接收到新的消息,read⽅法会返回⼀个新的消息,如果没有,就不返回。这是⼀个替代wait的⾮阻塞⽅法
unt_messages()
返回消息队列数量
6.WebSocket.has_messages()
如果有新消息返回True,否则返回False
7.WebSocket.send(message)
向客户端发送消息
8.WebSocket.__iter__()
websocket迭代器
客户端:
这是客户端的⼀些说明,在客户端,websocket的两个属性:readyState和bufferedAmount,区别和说明如下:根据readyState属性可以判断webSocket的连接状态,该属性的值可以是下⾯⼏种:
0 :对应常量CONNECTING (numeric value 0),
正在建⽴连接连接,还没有完成。The connection has not yet been established.
1 :对应常量OPEN (numeric value 1),
连接成功建⽴,可以进⾏通信。The WebSocket connection is established and communication is possible.
2 :对应常量CLOSING (numeric value 2)
连接正在进⾏关闭握⼿,即将关闭。The connection is going through the closing handshake.
3 : 对应常量CLOSED (numeric value 3)
连接已经关闭或者根本没有建⽴。The connection has been closed or could not be opened.
根据bufferedAmount可以知道有多少字节的数据等待发送,若websocket已经调⽤了close⽅法则该属性将⼀直增长。代码简单实现:
views.py:
import redis
from dwebsocket.decorators import accept_websocket
r = redis.Redis(host='localhost', port=6379)
使⽤全局变量
data = ''
#接受前端信息 socket
@accept_websocket
def test_socket(request):
调⽤全局变量
global data
判断是否是websocket
if request.is_websocket():
for message in request.websocket:
data = message.decode()
print(data)
# request.websocket.send(message)
@accept_websocket
def test_websocket(request):
调⽤全局变量
global data
# data = data.decode()
判断是否是websocket请求
if request.is_websocket():
while 循环⼀次
while 1:
time.sleep(1) ## 向前端发送时间
判断是否有值,如果有返回⽇期还是data中的数据
if data:
dit = {
'time':time.strftime('%Y.%m.%d %H:%M:%S',time.localtime(time.time())),
'data': data
}
request.websocket.send(json.dumps(dit))
循环⼀次之后赋值为空
data = ''
路由url.py:
# 推送
path('/socket_test',TemplateView.as_view(template_name='md_admin_user/socket.html')),
path('/websocket_test',TemplateView.as_view(template_name='md_admin_user/socket_push.html')), path('/test_socket',test_socket),
path('/test_websocket',test_websocket),
后端html:
<body>
<input id="chat-message-input" type="text" size="100"/><br/>
<input id="chat-message-submit" type="button" value="Send" onclick='sendmessage()'/>
</body>
<script>
var websocket
//⽣成socket对象
websocket和socketvar socket = new WebSocket("ws:" + window.location.host + "/md_admin_user/test_socket"); pen = function () {
console.log('WebSocket open');//成功连接上Websocket
};
console.log('message: ' + e.data);//打印服务端返回的数据
};
console.log(e);
socket.close(); //关闭TCP连接
};
if (adyState == WebSocket.OPEN){
}
window.s = socket;
function sendmessage(){
window.s.ElementById("chat-message-input").value);
}
</script>
前端html:
<script>
//⽣成socket对象
var socket = new WebSocket("ws:localhost:8000/md_admin_user/test_websocket"); pen = function () {
console.log('WebSocket open');//成功连接上Websocket
};
console.log('message: ' + e.data);//打印服务端返回的数据
};
console.log(e);
socket.close(); //关闭TCP连接
};
if (adyState == WebSocket.OPEN){
}
</script>
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论