Python 无法使用Flask SocketIO将消息发送到房间

Python 无法使用Flask SocketIO将消息发送到房间,python,flask-socketio,python-socketio,Python,Flask Socketio,Python Socketio,我正在开发一个简单的聊天应用程序,我一直在尝试使用Flask SocketIO向房间发送消息 来自客户端的“mesage_事件”事件很好地到达了服务器,但是在客户端我看不到任何东西。我不知道服务器是否向房间发送了一些信息,但在客户端,我在控制台中看不到任何信息我只能通过广播成功发送给所有客户端。 以下是我在服务器端的代码: @socketio.on("send msg") def sendsocket(data): print("send msg start:", data["msg"]

我正在开发一个简单的聊天应用程序,我一直在尝试使用Flask SocketIO向房间发送消息

来自客户端的“mesage_事件”事件很好地到达了服务器,但是在客户端我看不到任何东西。我不知道服务器是否向房间发送了一些信息,但在客户端,我在控制台中看不到任何信息我只能通过广播成功发送给所有客户端。

以下是我在服务器端的代码:

@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);
});

你错过了两件事

1st,您需要向服务器发送一个
“加入”
事件

<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>
在处理程序中,需要调用方法将用户添加到当前命名空间下的文件室中。请注意关于名称空间的那部分。默认情况下,所有连接都位于根(
/
)命名空间下。如果您有自定义名称空间,那么每个名称空间都有自己的文件室

也有相应的方法

以下是完整的服务器端代码:

@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>
以下是完整的客户端代码:

@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>
在第一个用户加入聊天室时(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

你错过了两件事

1st,您需要向服务器发送一个
“加入”
事件

<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>
在处理程序中,需要调用方法将用户添加到当前命名空间下的文件室中。请注意关于名称空间的那部分。默认情况下,所有连接都位于根(
/
)命名空间下。如果您有自定义名称空间,那么每个名称空间都有自己的文件室

也有相应的方法

以下是完整的服务器端代码:

@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>
以下是完整的客户端代码:

@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>
在第一个用户加入聊天室时(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

我已经实施了这两个步骤,但没有成功。我有两个html页面,一个用于“房间列表”,另一个用于“房间页面本身”。它们都有自己的js文件,并且都尝试连接到套接字。我正在从“房间列表”的第一页向服务器发送“加入房间”事件。然后服务器将呈现“文件室页面本身”。在这种情况下,将生成一个新的套接字连接。我看到有一个新的sid值。也许这就是问题所在?在渲染到新页面房间页面后,如何使用“房间页面本身”的第二个js文件中的原始套接字?我已经实现了这两个步骤,但没有成功。我有两个html页面,一个用于“房间列表”,另一个用于“房间页面本身”。它们都有自己的js文件,并且都尝试连接到套接字。我正在从“房间列表”的第一页向服务器发送“加入房间”事件。然后服务器将呈现“文件室页面本身”。在这种情况下,将生成一个新的套接字连接。我看到有一个新的sid值。也许这就是问题所在?在渲染到新页面(房间页面)后,如何使用“房间页面本身”的第二个js文件中的原始套接字?您是否在任何时候调用了
join\u room()
函数?如果向某个文件室发射,则只有加入该文件室的客户端才会接收事件。是,如下所述。但我似乎从客户那里得到了两个sid。一个在加入房间后,一个在发送消息后。原因可能是我有两个js文件用于两个html文件,如下所述。我想我需要在第二个js文件中使用socket变量,而不尝试连接到新的套接字,对吗?但是怎么做呢?你在改变html页面吗?如果页面发生更改,则客户端将删除所有连接并创建新连接。如果你加入了一个房间,当你切换到另一个页面时,这个房间就会消失。改为构建一个单页应用程序,然后将保留连接。您是否在任何时候调用了
join\u room()
函数?如果向某个文件室发射,则只有加入该文件室的客户端才会接收事件。是,如下所述。但我似乎从客户那里得到了两个sid。一个在加入房间后,一个在发送消息后。原因可能是我有两个js文件用于两个html文件,如下所述。我想我需要在第二个js文件中使用socket变量,而不尝试连接到新的套接字,对吗?但是怎么做呢?你在改变html页面吗?如果页面发生更改,则客户端将删除所有连接并创建新连接。如果你加入了一个房间,当你切换到另一个页面时,这个房间就会消失。改为构建一个单页应用程序,然后将保留连接。