概述:

WebSocket 是什么?

WebSocket 是 HTML5 提供的一种浏览器与服务器间进行全双工通讯的协议。依靠这种协议可以实现客户端和服务器端 ,一次握手,双向实时通信。

WebSocket 服务端:

用的是 dwebsocket,安装命令pip install dwebsocket.

WebSocket  基本方法:

1.request.is_websocket()
        如果是个websocket请求返回True,如果是个普通的http请求返回False,可以用这个方法区分它们。

2.request.websocket
        在一个websocket请求建立之后,这个请求将会有一个websocket属性,用来给客户端提供一个简单的api通讯,如果request.is_websocket()是False,这个属性将是None。

3.WebSocket.wait()
        返回一个客户端发送的信息,在客户端关闭连接之前他不会返回任何值,这种情况下,方法将返回None

4.WebSocket.read()
         如果没有从客户端接收到新的消息,read方法会返回一个新的消息,如果没有,就不返回。这是一个替代wait的非阻塞方法

5.WebSocket.count_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对象
var socket = new WebSocket("ws:" + window.location.host + "/md_admin_user/test_socket");
socket.onopen = function () {
console.log('WebSocket open');//成功连接上Websocket
};
socket.onmessage = function (e) {
console.log('message: ' + e.data);//打印服务端返回的数据
};
socket.onclose=function(e){
console.log(e);
socket.close(); //关闭TCP连接
};
if (socket.readyState == WebSocket.OPEN){
socket.onopen();
}
window.s = socket;
function sendmessage(){
window.s.send(document.getElementById("chat-message-input").value);
}
 
</script>
 
前端html:
 
<script>
 
//生成socket对象
var socket = new WebSocket("ws:localhost:8000/md_admin_user/test_websocket");
socket.onopen = function () {
console.log('WebSocket open');//成功连接上Websocket
 
};
socket.onmessage = function (e) {
console.log('message: ' + e.data);//打印服务端返回的数据
};
socket.onclose=function(e){
console.log(e);
socket.close(); //关闭TCP连接
};
if (socket.readyState == WebSocket.OPEN){
socket.onopen();
}
 
</script>
 
 
 

python websocket Django 实时消息推送的更多相关文章

  1. 开源实时消息推送系统 MPush

    系统介绍 mpush,是一款开源的实时消息推送系统,采用java语言开发,服务端采用模块化设计,具有协议简洁,传输安全,接口流畅,实时高效,扩展性强,可配置化,部署方便,监控完善等特点.同时也是少有的 ...

  2. 基于socket.io的实时消息推送

    用户访问Web站点的过程是基于HTTP协议的,而HTTP协议的工作模式是:请求-响应,客户端发出访问请求,服务器端以资源数据响应请求. 也就是说,服务器端始终是被动的,即使服务器端的资源数据发生变化, ...

  3. springboot+websocket+sockjs进行消息推送【基于STOMP协议】

    springboot+websocket+sockjs进行消息推送[基于STOMP协议] WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就 ...

  4. 【js学习】js连接RabbitMQ达到实时消息推送

    js连接RabbitMQ达到实时消息推送 最近在自己捯饬一个网站,有一个功能是需要后端处理完数据把数据发布到MQ中,前端再从MQ中接收数据.但是前端连接MQ又成了一个问题,在网上搜了下资料,点进去一篇 ...

  5. 未读消息(小红点),前端与 RabbitMQ实时消息推送实践,贼简单~

    前几天粉丝群里有个小伙伴问过:web 页面的未读消息(小红点)怎么实现比较简单,刚好本周手头有类似的开发任务,索性就整理出来供小伙伴们参考,没准哪天就能用得上呢. 之前在 <springboot ...

  6. 我有 7种 实现web实时消息推送的方案,7种!

    技术交流,公众号:程序员小富 大家好,我是小富- 我有一个朋友- 做了一个小破站,现在要实现一个站内信web消息推送的功能,对,就是下图这个小红点,一个很常用的功能. 不过他还没想好用什么方式做,这里 ...

  7. Worktile中百万级实时消息推送服务的实现

    Worktile中百万级实时消息推送服务的实现 出自:http://blog.jobbole.com/81125/

  8. asp.net mvc 实现简单的实时消息推送

    因为项目需要,需要在网页上实现消息的推送.在百度上搜索了一下,发现实现网页上的消息推送,可以使用asp.net 中的SignalR类库,当然也可以使用H5的WebSocket  Ajax的轮回.当然此 ...

  9. 拾人牙慧篇之——基于HTML5中websocket来实现消息推送功能

    一.写在前面 要求做一个,后台发布信息,前台能即时得到通知的消息推送功能.网上搜了也有很多方式,ajax的定时询问,Comet方式,Server-Sent方式,以及websocket.表示除了定时询问 ...

随机推荐

  1. react native练习

    import React, { Component } from 'react' import { Platform, StyleSheet, Text, View,Image ,FlatList} ...

  2. SQL语句实现行转列

    最近在维护一个项目,出现了一下bug需要进行调试,于是把正式库上面的代码搬到本地库上面,数据库是本地的,跑项目的时候调试发现代码里面带有wmsys.wm_concat函数的SQL语句出现错误,经排查发 ...

  3. C++学习笔记:多态篇之虚析构函数

    动态多态中存在的问题:可能会产生内存泄漏! 以下通过一个例子向大家说明问什么会产生内存泄漏: class Shape//形状类 { public: Shape(); virtual double ca ...

  4. 理解什么是适配器(adapter)和接口(interface)

    ● 适配器(adapter) In computing, adapter is a hardware device or software component that converts transm ...

  5. MapReduce(二) MR的高级特性-序列化、排序、分区、合并

    一.序列化   (*) 核心接口:Writable接口.如果有一个类实现了Writable接口,就可以作为Map/Reduce的key和value.    举例: 读取员工数据,生成员工对象,直接存储 ...

  6. Python2.0 与 3.0 的区别

    Python 2.0 =默认编码=ASSIC=不支持中文 Python 3.0 =默认编码=UNICODE=默认支持中文   In summary : Python 2.x is legacy, Py ...

  7. SpringSecurity简单记录

    在pom.xml中将springsecurity导入后,对于springsecurity会出现三个依赖包:spring-security-web,spring-security-config,spri ...

  8. Js函数基本介绍

    1. 函数的创建 在JavaScript里面创建函数的关键字为function 函数名:就是在我们调用函数的时候需要书写的标识符 形参:全称为形式参数,调用函数的时候,这个函数所需要的参数是什么 实参 ...

  9. VMware 物理机可以复制文件到虚拟机,却无法从虚拟机复制文件到物理机(已解决)

    物理机运行,输入gpedit.msc确定,把如图的那个改成“已禁用” 之后虚拟机重新安装VMware Tool重启即可 事情是这样的,每次打开IDM会 “警告:您在以管理员身份运行IDM,在该模式下, ...

  10. Java第一个程序之HelloWorld

    代码实现如下图: 讲解: 1.主方法入口main():public static void main(string[] args){}是Java应用程序执行的入口点,必须提供该方法才能被执行: 2.打 ...