Невозможно отправить сообщение в комнату, используя Flask -SocketIO - PullRequest
0 голосов
/ 23 февраля 2020

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

Событие «mesage_event» от клиента хорошо достигает сервера, но затем я ничего не вижу на стороне клиента. Я не знаю, испускает ли сервер что-то в комнату, но на стороне клиента я ничего не вижу в консоли. Я могу только успешно отправить всем клиентам с вещанием.

Вот мой код на стороне сервера:

@socketio.on("send msg")
def sendsocket(data):
    print("send msg start:", data["msg"])
    msg = data["msg"]
    room = data["room"]
    emit("message_event", msg, room = room)

А на стороне клиента:

1- для отправки сообщения:

socket.emit('send msg', {'msg': msg, 'room': room})

2- для запуска обработчика события:

socket.on('message_event', data => {
    console.log("message received:", data);
});

1 Ответ

1 голос
/ 23 февраля 2020

Вам не хватает 2 вещей.

1-й , вам необходимо отправить событие "join" на сервер.

<script>
function joinRoom() {
    console.log("ask server to join room");
    socket.emit("join", { "user": Date.now(), "room": "Notifications" });
}
</script>

<body>
    <button onclick="joinRoom()">Join</button>
</body>

Например, здесь я прикрепил триггер к кнопке. И чтобы упростить первоначальное тестирование добавления пользователей в комнаты, я использую Date.now() в качестве имени пользователя. Вы можете открывать разные вкладки для обслуживания разных пользователей.

2nd , вам нужно иметь обработчик для этого события join.
В есть пример Комнаты и пространства имен раздел Flask -SocketIO документов.

@socketio.on("join")
def on_join(data):
    user = data["user"]
    room = data["room"]
    print(f"client {user} wants to join: {room}")
    join_room(room)
    emit("room_message", f"Welcome to {room}, {user}", room=room)

В обработчике вам нужно вызвать метод join_room, чтобы добавить пользователя в комната под текущим пространством имен . Обратите внимание, что часть о пространстве имен. По умолчанию все соединения находятся в пространстве имен root (/). Если у вас есть пользовательские пространства имен, то каждое пространство имен будет иметь свои собственные комнаты.

Существует также соответствующий метод leave_room.

Вот полная сторона сервера код:

@socketio.on("connect")
def connect():
    print("client wants to connect")
    emit("status", { "data": "Connected. Hello!" })

@socketio.on("join")
def on_join(data):
    user = data["user"]
    room = data["room"]
    print(f"client {user} wants to join: {room}")
    join_room(room)
    emit("room_message", f"Welcome to {room}, {user}", room=room)

Вот полный код на стороне клиента:

<script type="text/javascript" charset="utf-8">
    const socket = io();
    socket.on("connect", () => {
        console.log("connect");
    });
    socket.on("status", (status) => {
        console.log("received status: " + status.data);
    });
    socket.on("room_message", (msg) => {
        console.log("message from room: " + msg);
    });
    function joinRoom() {
        console.log("ask server to join room");
        socket.emit("join", { "user": Date.now(), "room": "Notifications" });
    }
</script>

<body>
    <button onclick="joinRoom()">Join</button>
</body>

Теперь вы можете открыть несколько вкладок и подключить каждую из них к серверу. На стороне сервера должны отображаться следующие сообщения:

client wants to connect
client wants to connect
client wants to connect
client 1582428076724 wants to join: Notifications
client 1582428080023 wants to join: Notifications
client 1582428082916 wants to join: Notifications

И, если 1-й пользователь войдет в комнату (1582428076724), вы сможете увидеть журналы, когда другие пользователи входят в комнату.

connect 
received status: Connected. Hello!
ask server to join room 
message from room: Welcome to Notifications, 1582428076724 
message from room: Welcome to Notifications, 1582428080023 
message from room: Welcome to Notifications, 1582428082916
...