使用flask-socketio实现WebSocket消息广播

4 篇文章 0 订阅
4 篇文章 0 订阅

目的

在flask应用内,通过引入flask-socketio实现站内WebSocket消息广播。各网页接收广播消息并动态刷新页面。

为便于观察,我们通过向服务端发送"/push" http 请求,触发站内广播;并通过Flask-SocketIO的广播模式,将广播信息通过WebSocket接口发送到客户端浏览器打开的网页。网页根据接收到的信息动态展示内容。

实现

服务端搭建Flask应用

首先在服务端搭建Flask应用并引入flask-socketio,然后编写服务端代码:

# _*_ coding:utf-8 _*_
from flask import Flask, render_template
from flask_socketio import SocketIO, emit

app = Flask(__name__)
app.config['SECRET_KEY'] = 'D20fndvfMK27^313787-AQl131'

socketio = SocketIO()

socketio.init_app(app)

name_space = '/abcd'


@app.route('/abc')
def get_abc():
    """demo page"""
    return render_template('abc.html')


@app.route('/push')
def push_once():
    """broadcast event generator"""
    event_name = 'abcde'
    broadcasted_data = {'data': "pushed once!"}
    socketio.emit(event_name, broadcasted_data, broadcast=True, namespace=name_space)
    return 'done!'


@socketio.on('connect', namespace=name_space)
def connected_msg():
    """socket client event - connected"""
    print('client connected!')


@socketio.on('disconnect', namespace=name_space)
def disconnect_msg():
    """socket client event - disconnected"""
    print('client disconnected!')


if __name__ == '__main__':
    socketio.run(app)

编写html网页SocketIO客户端代码

abc.html是我们的演示界面,包含了采用socket.io.js的WebSocket客户端代码。

<!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>Demo of Socket BroadCast</h2>
<div id="t"></div>
<script>
$(document).ready(function () {
    namespace = '/abcd';
    var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace);
    socket.on('abcde', function (res) {
        var t = res.data;
        if (t) {
            $("#t").append(t).append('<br/>');
        }

    });
});
</script>
</body>
</html>
演示push请求及各客户端的动态响应

在这里插入图片描述
当在浏览器端请求/push时,左侧两个打开的“/abc"网页会动态打印新的"pushed once!"行。

延伸阅读

关于 WebSocket

WebSocket是HTML5引入的新的通信协议,主要由Web客户端和服务端组成。与HTTP连接不同,WebSocket连接是客户端和服务器之间永久的双向通信通道,其中任何一个都可以启动交换。 一旦建立,连接一直有效,直到其中一方断开连接。

关于 Flask-SocketIO

flask框架提供了网页和网站的快速开发能力,一个重要的原因,就是flask相关扩展包非常丰富。而在WebSocket通信方面,flask-socketio扩展包,实现了flask应用内的socket通信能力。具体可参考Flask-SocketIO官方文档

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
好的,以下是使用 Flask-RESTful 和 Flask-SocketIO 构建前后端分离的聊天程序的示例代码: 后端代码: ```python from flask import Flask, request from flask_restful import Resource, Api from flask_cors import CORS from flask_socketio import SocketIO, send, emit app = Flask(__name__) api = Api(app) CORS(app) socketio = SocketIO(app, cors_allowed_origins='*') class Chat(Resource): def get(self): return {'message': 'Welcome to the chat app!'} def post(self): data = request.get_json() message = data['message'] emit('message', message, broadcast=True) return {'message': message} api.add_resource(Chat, '/chat') if __name__ == '__main__': socketio.run(app, debug=True) ``` 前端代码: ```html <!DOCTYPE html> <html> <head> <title>Chat App</title> </head> <body> <h1>Chat App</h1> <div id="messages"></div> <form> <input id="message" type="text"> <button type="submit" id="send">Send</button> </form> <script src="https://cdn.socket.io/socket.io-3.1.0.min.js"></script> <script> const socket = io('http://localhost:5000'); socket.on('message', function (data) { const messages = document.getElementById('messages'); messages.innerHTML += '<p>' + data + '</p>'; }); const form = document.querySelector('form'); form.addEventListener('submit', function (event) { event.preventDefault(); const input = document.getElementById('message'); const message = input.value; socket.emit('message', message); input.value = ''; }); </script> </body> </html> ``` 在这个示例中,我们创建了一个名为 Chat 的资源,其中 GET 请求将返回欢迎消息,而 POST 请求将广播收到的消息。我们使用 Flask-SocketIO 在后端处理 WebSocket 连接,并使用 emit 函数将消息发送给所有连接的客户端。前端代码使用 Socket.IO 客户端库来建立 WebSocket 连接,并使用 emit 函数将用户输入的消息发送到服务器。收到服务器发送的消息时,前端代码将其显示在页面上。 要运行此示例,请确保已安装 FlaskFlask-RESTful、Flask-Cors 和 Flask-SocketIO,并在终端中运行以下命令: ``` $ export FLASK_APP=app.py $ flask run ``` 然后在浏览器中打开 http://localhost:5000/,即可开始聊天。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pierre_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值