2013-05-07 126 views
30

我想在Socket.IO之上建立一個簡單的聊天室系統,用戶可以創建一個新的聊天室,然後人們可以開始聊天。Socket.IO訂閱多個頻道

這聽起來很簡單,但是現在我正在運行Socket.IO 0.9.4,在閱讀了幾篇SO帖子以及socket.io上的文檔後,我越來越困惑。所以,我希望有人能夠給我提供0.9.4版的指令:

  1. 我需要一種方法來訂閱房間。房間名稱由用戶選擇。當信息發佈在房間中時,用戶應該收到它。我應該如何編寫服務器代碼,我應該如何編寫客戶端代碼?

  2. 用戶可以同時加入多個房間。

  3. 我想要另一個系統發送消息給某個房間的所有用戶。這個「另一個系統」通過express處理的請求發送消息。我將如何編寫該請求處理程序?

+0

你解決了這個問題嗎?如果是的話,你可以指向我的源代碼?謝謝 – sinusGob 2017-05-01 20:55:19

回答

88

這是所有相當與socket.io客房設有簡單。查看LearnBoost wiki上的文檔。

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

它允許連接到多個房間在單個插座。我用下面的代碼進行了一次快速測試。

服務器

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

客戶

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

從快速通道發送消息是很簡單的爲好。

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

有沒有辦法讓客戶離開兩個房間的任何一個加入? – kbariotis 2013-09-29 14:38:06

+0

我不確定。您可以將2個房間存儲在一個數組中,然後執行循環並取消訂閱。或者可能有斷開功能。 (我從來沒有用過) – 2013-10-14 12:09:27

+0

@kbariotis完全。創建一個類似於「離開」的消息,讓你的客戶發送一個他想離開的房間的名字。然後連接「斷開」按鈕發送此類消息。服務器端,請訂購套接字離開給定的房間。 – 2015-05-13 09:23:51