2009-12-11 6 views
4

Je construis un système de discussion en utilisant EventMachine et ruby ​​on rails. C'est à des fins d'apprentissage.EventMachine: Comment construire un système de discussion avec l'application Rails

Voici comment le client se connecte au serveur.

c = TCPSocket.open(ip_address, port) 
data = {:user_id => 2, :message => 'hello world'} 
c.send(data) 
response = c.gets 
c.close 

Cela fonctionne. Cependant, le problème est que je ne peux pas obtenir la liste des personnes qui discutent actuellement dans la salle parce que, comme je l'ai montré ci-dessus, le client ouvre et ferme constamment la connexion.

Un autre plan consiste à exécuter un client EventMachine pour chaque utilisateur connecté. Je prévois de stocker la connexion client en session pour chaque utilisateur. De cette façon, je vais utiliser la même question pour chaque utilisateur. Lorsque l'utilisateur se déconnecte, je ferme la connexion.

Cependant, si l'utilisateur quitte, comment puis-je fermer la connexion client.

Aucune idée.

Répondre

1

Si les messages sont stockés dans la base de données, interrogez-les pour les utilisateurs ayant écrit un message au cours des 5 dernières minutes. De cette façon, s'ils sont inactifs pendant plus de cinq minutes, ils sont automatiquement considérés comme hors du salon. Au lieu d'écrire le vôtre, vous pouvez peut-être utiliser la bibliothèque Juggernaut au lieu de la remplacer par celle de

2

C'est un framework EventMachine qui a un exemple qui fait précisément ce genre de chose.

+0

Juggernaut ne supporte que le flash avec des douilles xml et rails2. Avez-vous des suggestions pour ceux qui veulent utiliser websockets et rails3? – Hackeron

+1

J'ai réussi à utiliser la bibliothèque [em-websocket] (https://github.com/igrigorik/em-websocket) pour EventMachine, mais vous devrez utiliser vos propres méthodes pour répartir les appels aux clients. – tadman

0

L'ancien IRC utilise le ping? pong! méthode, qui pourrait également être appliquée ici: D