场景

在应用中可能有一中场景,客户端A只需要发布消息,另一头多个客户端只需要接收客户端A发过来的消息,即发布订阅模式。也可用于大屏展示端,客户端只负责发布推送内容,广播接收端则进行消息接收。因此在flask应用内,通过引入flask-socketio实现站内WebSocket消息广播。各网页接收广播消息并动态刷新页面。为便于观察,我们通过向服务端发送"/push?msg=test" http 请求,触发站内广播;并通过Flask-SocketIO的广播模式,将广播信息通过WebSocket接口发送到客户端浏览器打开的网页。网页根据接收到的信息,动态展示发布者发布的内容。

参考文档

服务端程序

#!/usr/bin/env python
# encoding: utf-8
"""
@version: v1.0
@author: W_H_J
@license: Apache Licence
@contact: 415900617@qq.com
@software: PyCharm
@file: flaskIOTest.py
@time: 2019/2/20 12:04
@describe: flask-socketio 服务端
"""
import sys
import os
sys.path.append(os.path.abspath(os.path.dirname(__file__) + '/' + '..'))
sys.path.append("..")
from flask import Flask, render_template, request
from flask_socketio import SocketIO, emitapp = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO()
socketio.init_app(app)name_space = '/test'@app.route('/')
def get_abc():"""加载接收消息页面"""return render_template('index.html')@app.route('/push')
def push_once():"""广播消息发送消息:http://127.0.0.1:5000/push?msg=a"""event_name = 'message'data = request.args.get("msg")broadcasted_data = {'data': data}print("publish msg==>", broadcasted_data)socketio.emit(event_name, broadcasted_data, broadcast=True, namespace=name_space)return 'send msg successful!'@socketio.on('recevice message', namespace=name_space)
def test_message(message):print('recevice message', message)# emit('message', {'data': message['data']})@socketio.on('connect', namespace=name_space)
def connected_msg():"""客户端连接"""print('client connected!', request.sid)socketio.emit('abcde', 'hello', namespace=name_space)@socketio.on('disconnect', namespace=name_space)
def disconnect_msg():"""客户端离开"""print('client disconnected!')if __name__ == '__main__':print("conent http://127.0.0.1:5000")socketio.run(app, host='127.0.0.1', port=5000)

广播接收端index.html

因为是flask应用,所以index.html文件需要与服务端代码创建同级目录templates,并放置在该文件夹,否则无法加载。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Socket Demo</title><script type="text/javascript" src="//cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script><script type="text/javascript" src="//cdn.bootcss.com/socket.io/1.5.1/socket.io.min.js"></script>
</head>
<body><h2>websocket 广播接收</h2>
<div id="t"></div>
<script>
$(document).ready(function () {namespace = '/test';var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace);socket.on('message', function (res) {var t = res.data;if (t) {console.log(res);$("#t").append(t).append('<br/>');}});
});
</script>
</body>
</html>

消息广播

两种方式:

1. 基于web浏览器,请求 eg:http://127.0.0.1:5000/push?msg=我是测试消息;

2. 基于requests的请求:

import requestsdef push_msg(msg):html = requests.get("http://127.0.0.1:5000/push?msg=%s" % msg)print(html.text)if __name__ == '__main__':msg = """{"msg":"我是一条测试消息"}"""push_msg(msg)

python基于flask-socketio实现WebSocket消息广播(发布订阅模式)——贰相关推荐

  1. Java实现redis消息队列发布/订阅模式

    最近在一个老项目中需要用消息队列,本来想着用卡夫卡,但是试了几个版本之后发现jdk和卡夫卡版本一直对不上,最后选择用redis来实现消息队列的发布/订阅模式.感谢这位大佬的博客给了我很多的帮助,htt ...

  2. redis进阶之实现消息队列发布/订阅模式使用(七)

    Redis发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.微信. 微博.关注系统! Redis 客户端可以订阅任意数量的频道. ...

  3. 消息队列——发布订阅模式

    在 Redis 中提供了专门的类型:Publisher(发布者)和 Subscriber(订阅者)来实现消息队列. 在文章开始之前,先来介绍消息队列中有几个基础概念,以便大家更好的理解本文的内容. 首 ...

  4. Spring Boot 使用Redis发布订阅模式处理消息

    Spring Boot 使用Redis发布订阅模式 1. Redis发布订阅模式 2. Spring Boot中订阅消息 2.1 Redis监听器容器配置 2.2 创建通道监听器 2.3 测试订阅功能 ...

  5. mysql消息队列推送到redis_Redis实现消息队列之发布订阅模式

    发布订阅(pub/sub)是一种消息通信模式:发送者(pub)在某一频道发送消息,订阅者(sub)接收消息.发布订阅模式类似与微博关注,比如说博主mango被张三.李四.王五关注,那么mango发一篇 ...

  6. python杂志订阅系统详细设计_从发布-订阅模式谈谈 Flask 的 Signals

    发布-订阅模式 发布-订阅模式,顾名思义,就像大家订报纸一样,出版社发布不同类型的报纸杂志不同的读者根据不同的需求预定符合自己口味的的报纸杂志,付费之后由邮局安排人员统一派送. 上面一段话,提到了发布 ...

  7. RabbitMQ 服务异步通信 -- 入门案例(消息预存机制)、SpringAMQP、发布订阅模式(FanoutExchange、DirectExchange、TopicExchange)、消息转换器

    文章目录 1. 入门案例 2. 完成官方Demo中的hello world案例 2.1 创建1个工程,2个模块 2.1.1 父工程的依赖,子工程不需要导入额外的依赖 2.1.2 配置子工程的配置文件( ...

  8. kafka 发布-订阅模式_使用Apache Kafka作为消息系统的发布-订阅通信中的微服务,并通过集成测试进行了验证...

    kafka 发布-订阅模式 发布-订阅消息系统在任何企业体系结构中都起着重要作用,因为它可以实现可靠的集成而无需紧密耦合应用程序. 在解耦的系统之间共享数据的能力并不是一个容易解决的问题. 考虑一个企 ...

  9. 【MQTT 5.0】协议 ——发布订阅模式、Qos、keepalive、连接认证、消息结构

    一.前言 1.1 MQTT 协议概述 1.2 MQTT规范 二.MQTT 协议基本概念 2.1 发布/订阅模式 2.11 MQTT 发布/订阅模式 2.12 MQTT 发布/订阅中的消息路由 2.13 ...

最新文章

  1. 抽屉效果----mmdrawercontroller和viewdeck
  2. 免费使用《Autorun病毒防御者》
  3. JAVA Spring Cloud 注册中心 Eureka 相关配置
  4. 用Qt开发游戏时一些问题的解决方法(一)
  5. 【J2ME 2D 游戏开发系列】◣HIMI游戏开发启蒙教程◢JAVA零基础学习J2ME游戏开发全过程!...
  6. 状压dp之二之三 炮兵阵地/玉米田 By cellur925
  7. T-1-java语言基础
  8. 广联达2018模板算量步骤_广联达gtj2021实操案例,新增6大板块,快速提高算量效率...
  9. 精通webpack的5大关键点
  10. 另外一款超棒的响应式布局jQuery插件 – Freetile.js
  11. 深度强化学习:如何在AI工程实践中选择合适的算法?
  12. (26)Verilog HDL循环语句:repeat
  13. 【Flask-RESTPlus系列】Part2:响应编组
  14. Android客户端和服务器端数据交互的第四种方法
  15. Java面向对象思想
  16. DivCss 布局应用案例实践总结
  17. opencv无法打开源文件opencv2/opencv.hpp文件
  18. python MAC地址查询
  19. 从零开始搭建自己的网站四:博客网站模板下载
  20. 今日新闻简报 精选简报12条 2月1日

热门文章

  1. OpenCV小游戏-《跑跑卡丁车》项目实践-3
  2. 稳定婚姻(tarjan)
  3. 使用组件的render函数 改写el-table el-table-column
  4. Flutter自定义系列之折线波动图,心率图,价格走势图
  5. Go语言基础 结构体
  6. 芯片破壁者(五):Acorn和ARM所发现的移动时代
  7. 当今智能小家电是谁的”天下“
  8. Unity 布料模拟插件Magica Cloth
  9. ROG配置ubuntu20.04.5双系统要点
  10. 武汉理工大学C语言 作业练习