我正在构建一个简单的聊天应用程序,并且我一直在尝试通过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);
});
您缺少2件事。
1st,您需要将"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文档的Rooms and Namespaces部分中有一个示例。
@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
方法以将用户添加到房间在当前名称空间下。请注意有关名称空间的那部分。默认情况下,所有连接都在根(join_room
)命名空间下。如果您有自定义名称空间,则每个名称空间都将有自己的房间。
还有一种相应的/
方法。
这里是完整的服务器端代码:
leave_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)
并且第一个加入会议室的用户(1582428076724),您应该能够看到其他用户加入会议室的日志。
<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>