Flask socketio简单示例

最近看到可能会有这种需要实时消息的需求,至于后面会不会用到还不一定,就利用周末看看,写了个简单的示例。

记得以前写过django的版本,用的应该是channels,据说django3.0已经默认支持websocket了,但没去了解。 django版的旧例:https://github.com/Andy963/wechat.git

下面是flask socketio版本的: index.html 客户端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>
        flask socketio demo
    </title>
    <script src="https://cdn.bootcss.com/jquery/3.2.0/jquery.js">
    </script>
    <script crossorigin="anonymous" integrity="sha256-yr4fRk/GU1ehYJPAs8P4JlTgu0Hdsp4ZKrx8bDEDC3I="
            src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.2.0/socket.io.js">
    </script>
    <script src="https://code.jquery.com/jquery-3.5.1.min.js"
            integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0="
            crossorigin="anonymous"></script>
    </meta>
</head>
<body>
<h3>
    <h3>flask socketio demo</h3>
    <div>
        <label for="time">当前时间</label>
        <input id="time" disabled>
    </div>

    <form action="#">
        <label>发送信息</label>
        <input name="message" id="send">
        <button id="submit">提交</button>
    </form>
    <form action="#">
        <label>收到消息</label>
        <input name="res_msg" id="res">
    </form>
</h3>
<script>
    // 初始化连接
    var socket = io.connect('http://127.0.0.1:5000/test');

    socket.on('connect', function () {
        // 连接事件
    });

    $("#submit").click(function (event) {
        // 将要发送的消息发送给my event事件
        event.preventDefault();
        socket.emit('my event', {data: $("#send").val()})
    });

    socket.on('my event', function (message) {
        // 将接收到的消息写入到接收消息的框中
        var data = message.data;
        $("#res").val(data);

        //同时触发了timer事件,但消息为空,目的是让服务端返回时间,这个事件一直在继续,达到同步时间显示
        socket.emit('timer', {data: ''})
    });

    socket.on('timer', function (message) {
        // 服务端发送回来的时间字符串在网页上显示出来,同时又发送空消息继续触发服务端的timer事件
        $("#time").val(message.data);
        socket.emit('timer', {data: ''})
    })

</script>
</body>
</html>

服务端:flask

from flask import Flask, render_template
from flask_socketio import SocketIO, emit

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)


@app.route('/')
def index():
    # 获取页面
    return render_template('index.html')


@socketio.on('connect', namespace='/test')
def test_connect():
    # connect是事件名,namespace是命名空间
    print('建立连接...connect')


@socketio.on('timer', namespace='/test')
def sync_time(message):
    # time 是另一个事件,这里返回当前时间字符串
    from datetime import datetime
    now_str = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    emit('timer', {'data': now_str})


@socketio.on('my event', namespace='/test')
def test_message(message):
    # my event事件 将client发送过来的信息原路返回
    print('get message', message['data'])
    emit('my event', {'data': message['data']})


@socketio.on('disconnect', namespace='/test')
def test_disconnect():
    print('断开连接...disconnect')


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

其实flask socketio还支持聊天室,广播等功能,用到时再去了解吧,本篇的目的是了解基本的使用,原理。 本篇github地址:

上一篇:Gzip命令

下一篇:Zip 与unzip命令