2013-05-07 19 views
30

Voglio costruire un semplice sistema di chat room su Socket.IO dove l'utente può creare una nuova chat room e quindi le persone possono iniziare a chattare.Socket.IO sottoscrizione a più canali

Questo suono è semplice ma come Socket.IO 0.9.4 Ora sto lavorando, dopo aver letto alcuni post SO insieme al documento su socket.io, sto diventando sempre più confuso. Quindi, spero che qualcuno possa fornirmi istruzioni che FUNZIONANO con 0.9.4:

  1. Ho bisogno di un modo per iscrivermi a una stanza. Il nome della stanza è scelto dall'utente. Quando un messaggio viene pubblicato in una stanza, l'utente dovrebbe riceverlo. Come dovrei scrivere il codice del server, come dovrei scrivere il codice cliente?

  2. Un utente può unire più stanze contemporaneamente.

  3. Desidero che un altro sistema invii un messaggio a tutti gli utenti in una determinata stanza. Questo "altro sistema" invia il messaggio attraverso una richiesta gestita da express. Come scriverei questo gestore di richieste?

+0

Hai risolto questo problema? se così potessi indicarmi un codice sorgente? grazie – sinusGob

risposta

88

Questo è tutto piuttosto semplice con la funzionalità socket.io camere. Dai un'occhiata alla documentazione sul wiki di LearnBoost.

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

Permette ad essere collegata a camere multiple su un singolo socket. Ho messo insieme un test rapido con il seguente codice.

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

L'invio di un messaggio da un percorso Express è abbastanza semplice così.

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

C'è un modo per il cliente di lasciare una delle due stanze si sono uniti? – kbariotis

+0

Non ne sono sicuro. È possibile memorizzare le 2 stanze in un array, quindi fare un ciclo e annullare l'iscrizione. Oppure potrebbe esserci una funzione di disconnessione. (Non l'ho mai usato) –

+0

@kbariotis totalmente. Crea un messaggio come "leave" e chiedi al tuo cliente di inviarlo con il nome della stanza che desidera lasciare. Quindi collegare il pulsante "disconnect" per inviare questo messaggio. Lato server, ordina al socket di lasciare la stanza data. –

Problemi correlati