2010-05-07 3 views
1

Je construis un simple chat en direct dans une application web fonctionnant sur Django, mais une chose que je suis confus est de savoir comment je devrais stocker les messages entre les utilisateurs.Comment puis-je gérer les messages pour un simple chat en direct sur le Web, côté serveur?

Le chat se charge plusieurs utilisateurs, et une conversation « session » est composée d'utilisateurs connectés à un utilisateur qui est le « hôte ». L'application est une sorte de document de collaboration en ligne, donc l'utilisateur X a un document, et les utilisateurs Y et Z se connectent à l'utilisateur X pour parler du document, et ce serait une session de discussion.

Si l'utilisateur Y s'est déconnecté pendant cinq minutes, puis s'est reconnecté et reconnecté à l'utilisateur X, il ne devrait recevoir aucun des messages partagés entre les utilisateurs X et Z pendant son absence.

si les utilisateurs X, Y et Z peuvent avoir une session de chat sur le document de l'utilisateur X, les utilisateurs X et Y peuvent se connecter à une discussion simultanée, mais séparée sur le document de Z utilisateur.

Comment dois-je gérer cela? Dois-je garder chaque message dans la base de données? Chaque message aurait un utilisateur propriétaire et un utilisateur cible (l'hôte), et une table distincte serait utilisée pour connecter les utilisateurs aux messages (quels messages sont visibles par les utilisateurs).

Ou devrais-je stocker chaque session en tant que fichier HTML sur le serveur, les messages s'ajoutés à?

Le problème est, je ne peux pas envoyer des messages directement entre les clients. Ils doivent être envoyés au serveur dans une requête POST, puis chaque client doit vérifier périodiquement les messages dans une requête GET. Sauf que je ne peux pas effacer chaque message après qu'un client l'ait récupéré, car il peut y avoir plusieurs clients. Comment dois-je mettre cela en place? Aucune suggestion?

Répondre

2

Donnez chaque message un horodatage (ou tout simplement un ID incrémentiel). Ensuite, lorsque le client pool, vous lui envoyez tous les messages qui appartiennent à la conversation en cours, ce qui s'est passé dans les 10 dernières secondes, avec leurs horodatages. Le client peut alors filtrer les messages qu'il a déjà. Il regroupe toutes les 5 secondes environ. Si vous n'avez pas besoin des messages pour la journalisation, etc., vous pouvez supprimer les messages de plus de 10 secondes.

Notez que si vous souhaitez implémenter un chat qui vous semblerait vraiment rapide et réactif, vous devriez envisager d'utiliser Reverse Ajax. Dans ce cas, la réponse serait différente. Le serveur doit avoir une liste de clients enregistrés pour chaque conversation (clients ayant une requête HttpRequest en attente). Le serveur envoie ensuite à chacun d'entre eux tous les messages postés.

Et n'oubliez pas de search before you reinvent the wheel. L'une des meilleures fonctionnalités de Django est son archtecture d'applications connectables.

+1

Vous ne pouvez pas imaginer ma surprise lorsque j'ai cliqué sur le lien "Rechercher avant de réinventer la roue" et que Google était coincé sur le côté droit de mon écran. –

+0

@Carson - Même ici - et je suis un orateur hébreu! :) –

Questions connexes