[ Flask实现websocket ]


使用flask-socketio

官方文档

from flask import Flask, render_template, request
from flask_socketio import SocketIO, emit, send
from flask_socketio import join_room, leave_room
app = Flask(__name__)
app.config['SECRET_KEY'] = 'casdcasdf'
socketio = SocketIO(app)


@app.route('/')
def index():
    return render_template('index.html')


@app.route('/chf')
def chf():
    return render_template('index2.html')


def ack():
    print('执行成功回调函数')

# 接收消息


@socketio.on('message')  # 路由
def handle_message(data):
    print('有人发送消息: ' + str(data))
    # send('我是message')
    emit('message', "server返回给client的数据",
         #  broadcast=True,     # 在不使用to的时候, True为广播
         callback=ack,          # 回调函数, 没有触发??
         to='101')              # 房间号, 在这个房间都会广播数据


@socketio.on('message', namespace='/chf')  # 路由
def handle_message1(data):
    print('chf有人发送消息: ' + data)
    # send('我是message')
    emit('message', "chfserver返回给client的数据", namespace='/chf', broadcast=True)

# @socketio.on('message')  # 路由
# def handle_message(data):
#     print('my message: ' + data)
    # send('我是message')


@socketio.event
def my_custom_event(arg1, arg2, arg3):
    print('received args: ' + arg1 + arg2 + arg3)


@socketio.on('connect')
def handle_my_custom_event1():
    print('test有人来连接了:')
    emit('event', "test欢迎来连接使用聊天")


@socketio.on('connect', namespace='/chf')
def handle_my_custom_event2():
    print('chf有人来连接了')
    emit('event', "chf欢迎来连接使用聊天", namespace='/chf')


@socketio.on('my_event')
def handle_my_custom_event3(arg1):
    print('客户端连接成功后发送给我的消息: ' + str(arg1))


@socketio.on("disconnect")
def disconnect():
    print('有人断开连接了')

# 房间

# 加入房间


@socketio.on('join')
def on_join(data):
    id = request.sid
    username = data['username']
    room = data['room']
    join_room(room)
    send(username + ' has entered the room.', to=room)

# 退出房间


@socketio.on('leave')
def on_leave(data):
    username = data['username']
    room = data['room']
    leave_room(room)
    send(username + ' has left the room.', to=room)


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

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>聊天拉</title>
</head>
<body>
    <h1>聊天时间</h1>
    <button onclick="sendMessageToServer('你好阿')">1发送</button>
    <button onclick="MessageToServer('你好阿')">2发送</button>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.0.1/socket.io.js" integrity="sha512-q/dWJ3kcmjBLU4Qc47E4A9kTB4m3wuTY7vkFJDTZKjTs8jhyGQnaUrxa0Ytd0ssMZhbNua9hE+E7Qv1j+DyZwA==" crossorigin="anonymous"></script>
    <script type="text/javascript" charset="utf-8">
        let namespace='/test';
        var socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port,{transports: ['websocket']});


        // 添加一个连接监听器
        socket.on('connect', function() {
            socket.emit('my_event', {data: 'test I\'m connected!'});
        });

        // 添加一个接收监听器
        socket.on('message', function(message){
            console.log(message);
            // socket.emit('my message', {data: '你message'})
        })

        // 添加一个关闭连接的监听器
        socket.on('disconnect',function() {
            console.log('test 关闭连接!');
        }); 

        socket.on('event', function(message){
            console.log(message)
        })

        // socket.on('join', function(message){
        //     console.log(message)
        // })

        // 通过Socket发送一条消息到服务器
        function sendMessageToServer(message) {
            socket.emit('join',{username: 'chf', room: '101'});
        }
        function MessageToServer(message) {
            socket.emit('message', {data: message});
        }
    </script>
</body>
</html>