У меня возникают проблемы при попытке отправить сообщение указанному c клиенту в Flask -SocketIO. Для простоты я вынул логи базы данных c и несколько других кусочков кода, так как считаю, что они не имеют отношения к проблеме, с которой я сейчас сталкиваюсь.
РЕДАКТИРОВАТЬ 2: Я решил проблему , Всякий раз, когда я подключался, и вызывалась функция handle_user_connection . Я не указывал, какому клиенту сервер будет отправлять сообщение user_connected . Это можно увидеть в строке 3 кода на стороне сервера.
На стороне сервера
@socketio.on('connect')
def handle_user_connect():
socketio.emit("user_connected", {"id":request.sid},callback=messageReceived,room=request.sid)
@socketio.on("join")
def on_join(data):
client = request.sid
room = f"{data['chatroom_name']}-{data['chatroom_id']}"
join = user_num < user_limit
if join:
join_room(room)
sessions[client] = room #sessions is an ordered dictionary of users and the rooms they join
print(room)
socketio.emit("join",room=client)
socketio.emit("room_status", {'room_status': user_num}, room=room)
else:
print(f"room {name} full.")
На стороне клиента
var socket = io.connect("http://127.0.0.1:5000" ,{'sync disconnect on unload': true });
socket.on("user_connected", function() {
socket.emit("join", {id: chatroom_id, name: chatroom_name})
});
socket.on("join",function (msg) {
prompt_username_change(msg)
});
socket.on("room_status",function (msg) {
update_user_number(msg);
});
Всякий раз, когда я пытаюсь отправить сообщение о присоединении просто клиенту, как видно в строке 10 кода на стороне сервера, сервер отправляет соединение всем пользователям в комнате. Это видно на примере пользователей, присоединяющихся к комнате под названием «roomtest-10».
emitting event "join" to c557f6c6804c47e5994ef340cabd81ed [/]
c557f6c6804c47e5994ef340cabd81ed: Sending packet MESSAGE data 2["join"]
emitting event "room_status" to roomtest-10 [/]
c557f6c6804c47e5994ef340cabd81ed: Sending packet MESSAGE data 2["room_status",{"room_status":1}]
127.0.0.1 - - [26/Apr/2020 14:58:23] "POST /socket.io/?EIO=3&transport=polling&t=N6saJeC&sid=7e72f51ad61b42f189ec96d85dfe2001 HTTP/1.1" 200 -
7e72f51ad61b42f189ec96d85dfe2001 is entering room roomtest-10 [/]
emitting event "join" to 7e72f51ad61b42f189ec96d85dfe2001 [/]
Несмотря на то, что 7e72f51ad61b42f189ec96d85dfe2001 уже находится в этой комнате, объединение повторно отправляется им, вызывая многочисленные проблемы.
РЕДАКТИРОВАТЬ: я добавил еще один пример журналов сервера и добавил в оператор печати, показывающий значение клиента, когда один пользователь пытается присоединиться, а другой уже подключен.
67a17a8d161741cea1a72a0ad6c05fc4: Received packet MESSAGE data 2["join",{"id":"45","name":"roomtest"}]
received event "join" from 67a17a8d161741cea1a72a0ad6c05fc4 [/]
LOGGING USER SESSION ID: e1e0d3dd17414795b887d291c15e9218
127.0.0.1 - - [26/Apr/2020 15:34:34] "POST /socket.io/?EIO=3&transport=polling&t=N6sibpv&sid=67a17a8d161741cea1a72a0ad6c05fc4 HTTP/1.1" 200 -
67a17a8d161741cea1a72a0ad6c05fc4 is entering room roomtest-45 [/]
emitting event "join" to 67a17a8d161741cea1a72a0ad6c05fc4 [/]
67a17a8d161741cea1a72a0ad6c05fc4: Sending packet MESSAGE data 2["join"]
LOGGING USER SESSION ID: 67a17a8d161741cea1a72a0ad6c05fc4
127.0.0.1 - - [26/Apr/2020 15:34:34] "GET /socket.io/?EIO=3&transport=polling&t=N6sibpy&sid=67a17a8d161741cea1a72a0ad6c05fc4 HTTP/1.1" 200 -
emitting event "room_status" to roomtest-45 [/]
Заранее спасибо!