2013-05-07 7 views
30

Chcę zbudować prosty system pokojów rozmów na górze Socket.IO, gdzie użytkownik może utworzyć nowy pokój rozmów, a następnie ludzie mogą rozpocząć czat.Socket.IO subskrybować wiele kanałów

Dźwięk ten jest prosty, ale jako plik Socket.IO 0.9.4. Teraz, po przeczytaniu kilku wpisów SO wraz z dokumentem na socket.io, jestem coraz bardziej zdezorientowany. Więc mam nadzieję, że ktoś może dostarczyć mi instrukcji, które współpracują z 0.9.4:

  1. Muszę sposób zapisać się do pokoju. Nazwa pokoju jest wybierana przez użytkownika. Kiedy wiadomość jest umieszczona w pokoju, użytkownik powinien ją otrzymać. Jak powinienem napisać kod serwera, jak mam napisać kod klienta?

  2. Użytkownik może jednocześnie dołączyć do wielu pomieszczeń.

  3. Chcę, aby inny system wysłał wiadomość do wszystkich użytkowników w określonym pokoju. Ten "inny system" wysyła wiadomość przez żądanie obsługiwane przez ekspres. Jak napisać ten moduł obsługi żądań?

+0

Rozwiązałeś ten problem? jeśli tak, to możesz wskazać mi kod źródłowy? dzięki – sinusGob

Odpowiedz

88

Wszystko to jest całkiem proste dzięki funkcji room.io. Zapoznaj się z dokumentacją na wiki LearnBoost.

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

Umożliwia on jest podłączony do wielu pomieszczeń na jednym gnieździe. Przygotowałem szybki test z następującym kodem.

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

Wysyłanie wiadomości z trasy Express jest dość proste, jak dobrze.

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

Czy istnieje sposób na to, aby klient opuścił któryś z dwóch pokoi? – kbariotis

+0

Nie jestem pewien. Możesz albo przechowywać 2 pokoje w tablicy, a następnie zrobić pętlę i zrezygnować z subskrypcji. Lub może istnieć funkcja odłączania. (Nigdy tego nie używałem) –

+0

@kbariotis totalnie. Utwórz wiadomość typu 'leave" i poproś klienta o przesłanie jej nazwy pokoju, który chce opuścić. Następnie podłącz przycisk "rozłącz", aby wysłać taką wiadomość. Po stronie serwera zamów gniazdo, aby opuściło dany pokój. –