0

我正在构建一个简单的聊天应用程序,我一直在尝试使用 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);
});
4

2 回答 2

3

你错过了两件事。

第一,您需要向"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()它作为用户名。您可以打开不同的选项卡以充当不同的用户。

第二,您需要有该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方法将用户添加到当前命名空间下的房间。请注意有关名称空间的部分。默认情况下,所有连接都在根 ( /) 命名空间下。如果您有自定义命名空间,那么每个命名空间都会有自己的房间。

也有相应的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

在第一个用户加入房间 (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
于 2020-02-23T03:22:55.647 回答
1

不知道为什么来自 flask_socketio 的发送和发射功能不起作用。如果我使用socketio(套接字实例),它将成功发送消息。

socketio.emit('EVENT_NAME', data, to='YOUR_ROOM')
于 2021-08-18T12:30:04.783 回答