2013-05-07 12 views
30

Ich möchte ein einfaches Chat-Room-System auf Socket.IO erstellen, wo Benutzer einen neuen Chat-Raum erstellen können und dann können die Leute beginnen zu chatten.Socket.IO abonnieren Sie mehrere Kanäle

Das klingt einfach, aber als Socket.IO 0.9.4 Ich laufe jetzt, nachdem ich ein paar SO-Posts zusammen mit dem Dokument auf socket.io gelesen habe, werde ich mehr und mehr verwirrt. Also, ich hoffe, dass jemand mir die Anweisung geben kann, dass WORK mit 0.9.4:

  • Ich brauche eine Möglichkeit, ein Zimmer zu abonnieren. Der Name des Raums wird vom Benutzer ausgewählt. Wenn eine Nachricht in einem Raum veröffentlicht wird, sollte der Benutzer sie erhalten. Wie sollte ich den Servercode schreiben, wie soll ich den Clientcode schreiben?

  • Ein Benutzer kann mehrere Räume gleichzeitig betreten.

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

  • +0

    Haben Sie dieses Problem gelöst? Wenn ja, könntest du mich auf einen Quellcode hinweisen? danke – sinusGob

    Antwort

    88

    Dies ist alles ziemlich einfach mit der socket.io Zimmer-Funktion. Sehen Sie sich die Dokumentation zum LearnBoost-Wiki an.

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

    Es ermöglicht über eine einzige Steckdose, um mehrere Räume verbunden sind. Ich habe einen Schnelltest mit folgendem Code erstellt.

    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); 
        }); 
    }); 
    

    Kunde

    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 }); 
    }); 
    

    eine Nachricht von einer Express-Route zu senden ist ziemlich ebenso 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'); 
    }); 
    
    +0

    Gibt es eine Möglichkeit für den Kunden, eines der beiden Zimmer zu verlassen? – kbariotis

    +0

    Ich bin mir nicht sicher. Sie können entweder die 2 Räume in einem Array speichern, dann eine Schleife machen und sich abmelden. Oder es kann eine Trennfunktion geben. (Ich habe das nie benutzt) –

    +0

    @kbariotis total. Erstellen Sie eine Nachricht wie '' leave'' und lassen Sie Ihren Kunden mit dem Namen des Zimmers, das er verlassen möchte, senden. Dann verdrahten Sie die "Trennen" -Taste, um eine solche Nachricht zu senden. Server-seitig, sortiere den Socket, um den gegebenen Raum zu verlassen. –

    Verwandte Themen