Verbessere Benutzerkommunikation im ChatRoom durch optimierte Nachrichtenreihenfolge
- Füge Debug-Ausgaben hinzu, um den Ablauf beim Hinzufügen neuer Benutzer zu protokollieren. - Sende wichtige Nachrichten (Raum- und Benutzerlisten) an den neuen Benutzer, bevor der checkerTask-Thread gestartet wird, um sicherzustellen, dass alle relevanten Informationen rechtzeitig bereitgestellt werden. - Implementiere eine kurze Verzögerung, um den Abschluss des WebSocket-Handshakes zu gewährleisten, bevor Nachrichten gesendet werden.
This commit is contained in:
@@ -122,22 +122,39 @@ namespace Yc
|
|||||||
newUser = std::make_shared<ChatUser>(shared_from_this(), _userName, color, socket);
|
newUser = std::make_shared<ChatUser>(shared_from_this(), _userName, color, socket);
|
||||||
}
|
}
|
||||||
_users.push_back(newUser);
|
_users.push_back(newUser);
|
||||||
newUser->start();
|
|
||||||
|
// Sende zuerst alle wichtigen Nachrichten, bevor der checkerTask Thread startet
|
||||||
|
#ifdef YC_DEBUG
|
||||||
|
std::cout << "[Debug] addUser: Starting message sequence for user: " << newUser->name() << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
if (_parent) {
|
if (_parent) {
|
||||||
Json::Value roomList = _parent->jsonRoomList();
|
Json::Value roomList = _parent->jsonRoomList();
|
||||||
|
#ifdef YC_DEBUG
|
||||||
|
std::cout << "[Debug] addUser: Sending roomList to user: " << newUser->name() << std::endl;
|
||||||
|
#endif
|
||||||
newUser->sendMsg(ChatUser::roomList, roomList, "", "");
|
newUser->sendMsg(ChatUser::roomList, roomList, "", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Kurze Pause, damit der WebSocket-Handshake vollständig abgeschlossen ist
|
// Kurze Pause, damit der WebSocket-Handshake vollständig abgeschlossen ist
|
||||||
|
#ifdef YC_DEBUG
|
||||||
|
std::cout << "[Debug] addUser: Waiting 100ms for WebSocket handshake..." << std::endl;
|
||||||
|
#endif
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||||
|
|
||||||
// Sende aktuelle Userliste an den neuen User
|
// Sende aktuelle Userliste an den neuen User
|
||||||
Json::Value currentUserList = userList();
|
Json::Value currentUserList = userList();
|
||||||
|
#ifdef YC_DEBUG
|
||||||
|
std::cout << "[Debug] addUser: Sending userListe to user: " << newUser->name() << std::endl;
|
||||||
|
#endif
|
||||||
newUser->sendMsg(ChatUser::userListe, currentUserList, "", "");
|
newUser->sendMsg(ChatUser::userListe, currentUserList, "", "");
|
||||||
|
|
||||||
// Sende aktualisierte Userliste an alle anderen User im Raum
|
// Sende aktualisierte Userliste an alle anderen User im Raum
|
||||||
for (auto &existingUser : _users) {
|
for (auto &existingUser : _users) {
|
||||||
if (existingUser != newUser) {
|
if (existingUser != newUser) {
|
||||||
|
#ifdef YC_DEBUG
|
||||||
|
std::cout << "[Debug] addUser: Sending userListe to existing user: " << existingUser->name() << std::endl;
|
||||||
|
#endif
|
||||||
existingUser->sendMsg(ChatUser::userListe, currentUserList, "", "");
|
existingUser->sendMsg(ChatUser::userListe, currentUserList, "", "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -147,6 +164,13 @@ namespace Yc
|
|||||||
std::cout << "[Debug] addUser: Sending 'user_entered_chat' message for user: " << newUser->name() << std::endl;
|
std::cout << "[Debug] addUser: Sending 'user_entered_chat' message for user: " << newUser->name() << std::endl;
|
||||||
#endif
|
#endif
|
||||||
addMessage(ChatUser::system, "user_entered_chat", newUser->name(), newUser->color());
|
addMessage(ChatUser::system, "user_entered_chat", newUser->name(), newUser->color());
|
||||||
|
|
||||||
|
// Starte den checkerTask Thread erst nach dem Senden aller wichtigen Nachrichten
|
||||||
|
#ifdef YC_DEBUG
|
||||||
|
std::cout << "[Debug] addUser: Starting checkerTask thread for user: " << newUser->name() << std::endl;
|
||||||
|
#endif
|
||||||
|
newUser->start();
|
||||||
|
|
||||||
_initRound();
|
_initRound();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -252,9 +252,20 @@ namespace Yc
|
|||||||
void ChatUser::checkerTask()
|
void ChatUser::checkerTask()
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
|
#ifdef YC_DEBUG
|
||||||
|
std::cout << "[Debug] checkerTask started for user: " << _name << " (socket: " << _socket << ")" << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Warte kurz, damit der WebSocket-Handshake vollständig abgeschlossen ist
|
// Warte kurz, damit der WebSocket-Handshake vollständig abgeschlossen ist
|
||||||
|
#ifdef YC_DEBUG
|
||||||
|
std::cout << "[Debug] checkerTask: Waiting 500ms for WebSocket handshake..." << std::endl;
|
||||||
|
#endif
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
||||||
|
|
||||||
|
#ifdef YC_DEBUG
|
||||||
|
std::cout << "[Debug] checkerTask: Starting heartbeat monitoring for user: " << _name << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Heartbeat-Intervall: Alle 10 Sekunden Verbindung prüfen
|
// Heartbeat-Intervall: Alle 10 Sekunden Verbindung prüfen
|
||||||
const int HEARTBEAT_INTERVAL = 2;
|
const int HEARTBEAT_INTERVAL = 2;
|
||||||
int heartbeatCounter = 0;
|
int heartbeatCounter = 0;
|
||||||
@@ -358,11 +369,15 @@ namespace Yc
|
|||||||
// Prüfe ob Socket noch gültig ist
|
// Prüfe ob Socket noch gültig ist
|
||||||
if (_socket < 0 || _stop) {
|
if (_socket < 0 || _stop) {
|
||||||
#ifdef YC_DEBUG
|
#ifdef YC_DEBUG
|
||||||
std::cout << "[Debug] Skipping send - socket invalid or user stopped" << std::endl;
|
std::cout << "[Debug] Skipping send - socket invalid (" << _socket << ") or user stopped (" << _stop << ") for user: " << _name << std::endl;
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef YC_DEBUG
|
||||||
|
std::cout << "[Debug] Sending message to user: " << _name << " (socket: " << _socket << ")" << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Entferne ggf. Token-Felder aus JSON-Strings und sende über Socket/WebSocket
|
// Entferne ggf. Token-Felder aus JSON-Strings und sende über Socket/WebSocket
|
||||||
Base::sanitizeTokensInString(out);
|
Base::sanitizeTokensInString(out);
|
||||||
Base::send(_socket, out);
|
Base::send(_socket, out);
|
||||||
@@ -372,11 +387,15 @@ namespace Yc
|
|||||||
// Prüfe ob Socket noch gültig ist
|
// Prüfe ob Socket noch gültig ist
|
||||||
if (_socket < 0 || _stop) {
|
if (_socket < 0 || _stop) {
|
||||||
#ifdef YC_DEBUG
|
#ifdef YC_DEBUG
|
||||||
std::cout << "[Debug] Skipping send - socket invalid or user stopped" << std::endl;
|
std::cout << "[Debug] Skipping send - socket invalid (" << _socket << ") or user stopped (" << _stop << ") for user: " << _name << std::endl;
|
||||||
#endif
|
#endif
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef YC_DEBUG
|
||||||
|
std::cout << "[Debug] Sending JSON message to user: " << _name << " (socket: " << _socket << ")" << std::endl;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Entferne rekursiv alle Token-Felder und sende über Socket/WebSocket
|
// Entferne rekursiv alle Token-Felder und sende über Socket/WebSocket
|
||||||
Base::sanitizeTokens(out);
|
Base::sanitizeTokens(out);
|
||||||
Base::send(_socket, out);
|
Base::send(_socket, out);
|
||||||
|
|||||||
Reference in New Issue
Block a user