Я создаю приложение чата 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.