it-swarm.com.de

Socket.IO abonniert mehrere Kanäle

Ich möchte ein einfaches Chatroom-System auf Socket.IO aufbauen, in dem Benutzer einen neuen Chatroom erstellen und dann mit dem Chatten beginnen können.

Das hört sich einfach an, aber da Socket.IO 0.9.4 jetzt ausgeführt wird, bin ich nach dem Lesen einiger SO) Posts zusammen mit dem Dokument auf socket.io immer verwirrter Ich hoffe also, dass mir jemand Anweisungen geben kann, die mit 0.9.4 ARBEITEN:

  1. Ich brauche eine Möglichkeit, ein Zimmer zu abonnieren. Der Raumname wird vom Benutzer gewählt. Wenn eine Nachricht in einem Raum gepostet wird, sollte der Benutzer sie erhalten. Wie soll ich den Servercode schreiben, wie soll ich den Clientcode schreiben?

  2. Ein Benutzer kann mehreren Räumen gleichzeitig beitreten.

  3. Ich möchte, dass ein anderes System eine Nachricht an alle Benutzer in einem bestimmten Raum sendet. Dieses "andere System" sendet die Nachricht über eine Anfrage, die von Express bearbeitet wird. Wie würde ich diesen Request-Handler schreiben?

40

Mit der Funktion socket.io rooms ist dies alles ziemlich einfach. Schauen Sie sich die Dokumentation im LearnBoost-Wiki an.

https://github.com/LearnBoost/socket.io/wiki/Rooms

Es ermöglicht die Verbindung zu mehreren Räumen über eine einzige Steckdose. Ich habe einen Schnelltest mit folgendem Code zusammengestellt.

Server

io.sockets.on('connection', function(socket){
    socket.on('subscribe', function(room) { 
        console.log('joining room', room);
        socket.join(room); 
    })

    socket.on('unsubscribe', function(room) {  
        console.log('leaving room', room);
        socket.leave(room); 
    })

    socket.on('send', function(data) {
        console.log('sending message');
        io.sockets.in(data.room).emit('message', data);
    });
});

Client

 var socket = io.connect();
 socket.on('message', function (data) {
  console.log(data);
 });

 socket.emit('subscribe', 'roomOne');
 socket.emit('subscribe', 'roomTwo');

 $('#send').click(function() {
  var room = $('#room').val(),
   message = $('#message').val();

  socket.emit('send', { room: room, message: message });
 });

Das Senden einer Nachricht über eine Express-Route ist ebenfalls recht einfach.

app.post('/send/:room/', function(req, res) {
    var room = req.params.room
        message = req.body;

    io.sockets.in(room).emit('message', { room: room, message: message });

    res.end('message sent');
});
103