FLASK socketio

561 阅读1分钟

前台

<script type="text/javascript">
    $(document).ready(function () {
        let namespace = "/chat"
        let socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace);
        console.log(location.protocol + '//' + document.domain + ':' + location.port + namespace)

        // 发送消息
        // namespace: /chat
        // event: request_for_response
        socket.emit('request_for_response', '{"name":"steven","age":23}');

        // 监听回复的消息
        // namespace: /chat
        // event: response
        socket.on('response', function (data) {
            if (data.code === '200') {
                console.log(data.msg)
            } else {
                alert('ERROR:' + data.msg);
                socket.disconnect()
            }
        });
    });
</script>

后台

# 当client连接成功自动回调到这里
# namespace: /chat
# event: connect
@sktio.on('connect', namespace='/chat')
def test_connect():
    print('Client connected')

# 当client断开连接自动回调到这里
# namespace: /chat
# event: disconnect
@sktio.on('disconnected', namespace='/chat')
def test_disconnected():
    print('Client disconnected')

# 接收前台发来的常规消息
# namespace: /chat
# event: request_for_response
@sktio.on('request_for_response',namespace='/chat')
def give_response(data):
    # data为client发过来的数据
    app.logger.debug(data)
    try:
        app.logger.debug(data.get("name"))
    except:
        app.logger.error("err")

    time.sleep(1)
    # 调用emit方法向前台发送消息,默认是由哪个namespace发来就往哪个namespace发送
    flask_socketio.emit('response',{'code':'200','msg':'start to process...'})

    time.sleep(4)
    flask_socketio.emit('response',{'code':'200','msg':'processed'})

广播

# 当一个消息在广播选项被开启的情况下被发出的时候,连接到这个命名空间的所有客户端都会收到这个消息
# 当然如果客户端没有针对该event处理,那就和没有收到一样了
flask_socketio.emit('response', {'code': '200', 'msg': 'processed'}, broadcast=True)

房间

    $(document).ready(function () {

        let namespace = "/chat"
        let socket = io.connect(location.protocol + '//' + document.domain + ':' + location.port + namespace);

        // 前台给后台发送消息
        socket.emit('request_join', {"username": randomString(8), "room": "EvenClass"});

		// 前台监听后台发来的消息
        socket.on('response_join', function (data) {
        });
        socket.on('response_leave', function (data) {
        });
    });
# 前台发来进入/退出的消息,后台通知房间内的所有clients(包括发来消息的人)
@sktio.on('request_join', namespace="/chat")
def on_join(data):
    username = data['username']
    room = data['room']
    flask_socketio.join_room(room)
    flask_socketio.emit("join", {'code': '200', 'msg': username + ' has entered the room.'}, room=room)

@sktio.on('request_leave', namespace="/chat")
def on_leave(data):
    username = data['username']
    room = data['room']
    flask_socketio.leave_room(room)
    flask_socketio.emit("leave", {'code': '200', 'msg': username + ' has left the room.'}, room=room)