Как я могу заставить эту опцию комнаты работать в моем Flask приложении чата с SocketIO? - PullRequest
0 голосов
/ 22 января 2020

Я создаю приложение чата Flask и застрял при попытке использовать опцию комнаты при отправке сообщений.

До сих пор приложение ведет себя следующим образом ('handle_message'):

  • При широковещательной передаче по True функциональность чата работает во всем приложении.
  • Без Опция широковещания: сообщение отправляется и мгновенно просматривается только отправителем.
  • При опции комнаты сообщение не отображается Только по refre sh, но это выводит сообщение из хранилища.

Вот мой код.

application.py

"""
SocketIO Handlers
"""
@socketio.on('join')
def on_join(data):
    """ When user joins a channel """
    username = session["user_name"]
    room = data['channel']
    join_room(room)
    emit('announcement', {
        "msg" : session["user_name"] + ' enters the channel'
    }, room=room)
    print('### ' +username + ' has entered the room -> ' + room)

@socketio.on('leave')
def on_leave(data):
    """ When user leavs a channel """
    username = session["user_name"]
    room = data['channel']
    leave_room(room)
    emit('announcement', {
            "msg" : session["user_name"] + ' leaved the channel'
    }, room=room)
    print('### ' + username + ' has left the room -> ' + room)

@socketio.on('my event')
def handle_my_event(json):
    print('Received event from client:', str(json))
    emit('server response', json)

@socketio.on('handle_message')
def handle_message(data):
    """ Proces and transmit received messages """

    # handle data
    user = session['user_name']
    timestamp = data['timestamp']
    message = data['message']
    channel = data['channel']

    # print payload
    print('### Payload from user <' + user + '> ' + message + ' / ' + timestamp + '/ ' + channel)

    messages[channel].append([timestamp, user, message])

    # broadcast payload
    emit('server payload', {
        "user" : user,
        "timestamp" : timestamp,
        "msg" : message
    }, room=channel)
    print("### emit server payload send to room: " + channel)

client. js

$(document).ready(function () {

    /*
        Setup and connection
    */

    // Connect client
    var socket = io.connect('http://' + document.domain + ':' + location.port)

    // Listen on connections
    socket.on('connect', function () {

        socket.emit('my event', {
            data: 'User Connected'
        });

        // Log connection in console 
        console.log('User connected')
    });


    /*
        Listeners
    */

    // Listen on server event
    socket.on('server response', function (msg) {
        console.log(msg)
    });

    // Listen on 'server announcements'
    socket.on('announcement', function (msg) {
        $("#messageList").append('<li>#' + msg.msg + '</li>');
        console.log('<-Announcement received: ' + msg.msg)
    })

    // Listen on 'server payload' and add to chat
    socket.on('server payload', function (msg) {
        $("#messageList").append('<li> ' + msg.timestamp + ' / [' + msg.user + ']: ' + msg.msg + '</li >');
        console.log('<- payload recieved:', msg.user, msg.timestamp, msg.msg);
    });

    /*
        Send data
    */

    // Send message to 'handle_message'
    $('#sendButton').on('click', function () {

        let msg = $('#message').val();
        let timestamp = new Date;
        let channel = $('#channelName').text();
        timestamp = timestamp.toLocaleTimeString();

        socket.emit('handle_message', {
            message: msg,
            timestamp: timestamp,
            channel: channel
        });
        $('#message').val('').focus();

        console.log('-> Sent payload to server')
    });

    // Send message when entering room
    $('ul#channelList li').on('click', function () {

        let cnl = $(this).text();
        console.log('clicket:' + $(this).text());
        socket.emit('join', {
            channel: cnl
        });

        console.log('-> Send emit join to server')
    })

    // Send announcement to 'left'
    $('#leaveRoom').on('click', function () {
        let cnl = document.querySelector("#channelName").textContent;
        socket.emit('leave', {
            channel: cnl
        });
    });

});

У кого-нибудь есть указатели? Я прошел через процесс пару раз, но в настоящее время не знаю, как поступить.

Заранее спасибо.

РЕДАКТИРОВАТЬ

Я захватил журналы, которые я печатаю на стороне сервера и клиента. Сделал это в 3 сценарии ios. Чтобы было понятно, я хочу, чтобы он работал с дескриптором комнаты = канала на socketio.on («полезная нагрузка отправлена»)

Timeline

Info
Channel names (rooms): channel1 and channel2
Users: user1, user2, user3

// socket.io('handle_message') with broadcast=True

Server: socketio.on('join) / '### <user1> enters the room -> channel1'
Server: socketio.on('join) / '### <user2> enters the room -> channel1'
Server: socketio.on('join) / '### <user3> enters the room -> channel2'
Client1: socket.emit('handle_message') / client log: "-> Sent payload to server" 
Server: socketio.on('handle message') / server log: "### Payload from <user1> well hello / 15:23:41 / channel1"
Server: socketio.emit('server payload') / server log: "### Emit server payload send to room: channel1"
Client1: socketio.on('server payload') / server log: "<- payload recieved: <user1> 15:23:41 Wel hello"
Client2: socketio.on('server payload') / server log: "<- payload recieved: <user1> 15:23:41 Wel hello"
Client3: socketio.on('server payload') / server log: "<- payload recieved: <user1> 15:23:41 Wel hello"

Result: Message received from user1 and instantly displayed in chat. 
However when in other (channel2) the messages is also received and displayed.As expected by the Broadcast handle on True. 


// socket.io('handle_message') without Broadcast

Server: socketio.on('join) / '### <user1> enters the room -> channel1'
Server: socketio.on('join) / '### <user2> enters the room -> channel1'
Server: socketio.on('join) / '### <user3> enters the room -> channel2'
Client1: socket.emit('handle_message') / client log: "-> Sent payload to server" 
Server: socketio.on('handle message') / server log: "### Payload from <user1> Well hello broadcast is off / 15:47:56 / channel1"
Server: socketio.emit('server payload') / server log: "### Emit server payload send to room: channel1"
Client1: socketio.on('server payload') / server log: "<- payload recieved: <user1> 15:47:56 Well hello broadcast"
Client2: socketio.on('server payload') / Nothing
Client2: socketio.on('server payload') / Nothing

Result: Message received from user1 and only seen and displayed at user1 client

// socket.io('handle_message') with room=channel handle

Server: socketio.on('join) / '### <user1> enters the room -> channel1'
Server: socketio.on('join) / '### <user2> enters the room -> channel1'
Server: socketio.on('join) / '### <user3> enters the room -> channel2'
Client1: socket.emit('handle_message') / client log: "-> Sent payload to server" 
Server: socketio.on('handle message') / server log: "### Payload from <user1> Does it works in this room? / 15:57:23 / channel1"
Server: socketio.emit('server payload') / server log: "### Emit server payload send to room: channel1"
Client1: socketio.on('server payload') / Nothing
Client2: socketio.on('server payload') / Nothing
Client2: socketio.on('server payload') / Nothing

Result: Message send by client1 looks to be received by server and send out by emit by server payload but never to be received by one of the clients. 
...