在socket.io
文档中,我看到了一个房间的例子
io.on('connection', function(socket){
socket.on('say to someone', function(id, msg){
socket.broadcast.to(id).emit('my message', msg);
});
});
我有一条路线/rooms/:roomId
。
是否有可能使服务器和客户端之间发送的套接字只命中特定的房间?
我猜服务器应该是类似
的东西io.on('connection', function(socket){
socket.on('new msg from client', function(roomId, msg){
io.to(id).emit('new msg from server', msg);
});
});
,客户端应该发送带有
的消息socket.emit('new msg from client', roomId, msg);
和获取新消息只需使用
socket.on('new msg from server', function () {
document.getElementById('msgs').appendChild(...);
});
但是这能行吗?在我做这个之前,我不应该和socket.join(...)
一起加入房间吗?
对于我制作的俳句分享应用程序,我有这样的内容:
io.on('connection', function(socket) {
var socket_id = socket.id;
var client_ip = socket.handshake.headers['x-forwarded-for'] || socket.handshake.address.address;
clients.push(socket);
console.info('New client connected (id=' + socket.id + ').');
number_of_clients_connected++;
console.log('[' + client_ip + '] connected, ' + number_of_clients_connected + ' total users online.');
//when a socket is disconnected or closed, .on('disconnect') is fired
socket.on('disconnect', function() {
number_of_clients_connected--;
console.log('[' + client_ip + '] disconnected, ' + number_of_clients_connected + ' total users online.');
//on disconnect, remove from clients array
var index = clients.indexOf(socket);
if (index != -1) {
clients.splice(index, 1);
//console.info('Client gone (id=' + socket.id + ').');
}
});
所以它保留了一个客户端数组,当某些消息需要中继时,你可以指定客户端套接字ID…
//reads from latest_haikus_cache and sends them
socket.on('request_haiku_cache', function() {
latest_haikus_cache.forEach(function(a_latest_haiku) {
clients[clients.indexOf(socket)].emit('load_haiku_from_cache', a_latest_haiku);
});
});
允许服务器广播到任何房间,因此您可以支持让客户端请求服务器发送到房间,而该客户端不在房间中。这完全取决于你想做什么。
所以,如果你想让你的服务器有这样的代码,让任何客户端发送消息到他们选择的任何房间:
io.on('connection', function(socket){
socket.on('new msg from client', function(roomId, msg){
io.to(roomId).emit('new msg from server', msg);
});
});
那么,你确实可以这样做,它将工作。是否合适完全取决于您的应用程序,以及您是否希望任何客户端能够向任何具有其名称的房间广播。
但是这能行吗?
是的,它会工作的。
我不应该先用socket.join(…)连接房间吗?
没有必要让客户端加入房间,除非它想接收该房间的消息。你不需要在房间里就能请求服务器发送到那个房间如果你想这样做的话。所以,这一切完全取决于你的应用程序和什么是合适的。
我不明白你问题的这一部分是什么意思。如果你愿意进一步解释,我也会尽力帮助你。我有一个路由/rooms/:roomId。
是否有可能使正在发送的套接字在服务器和客户只去特定的房间吗?