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

场景

在应用中可能有一中场景,客户端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, emit
 
app = 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 requests
 
 
def push_msg(msg):
    html = requests.get("http://127.0.0.1:5000/push?msg=%s" % msg)
    print(html.text)
 
 
if __name__ == '__main__':
    msg = """{"msg":"我是一条测试消息"}
    """

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值