Unir el socket io room en connect

Estoy tratando de hacer que un usuario conectado inicie session en una determinada habitación de socket.io en connect. Según los ejemplos que encontré en la networking, parece que he emitido alguna acción del cliente para poder unirme a alguna sala. Algo como:

socket.on('connect', function() { socket.emit('join', 'room1'); }); 

Server.js:

 io.sockets.on('connection', function(socket) { socket.on('join', function(room) { socket.join(room); }); }); 

Y según la mayoría de los tutoriales debería funcionar.

Lo que estoy pensando hacer es:

 socket.on('connect', function() { socket.join('room1'); }); 

Pero parece que no funciona, ya que cualquier post que emita desde el server no está atrapado en el cliente. Alguna idea, ¿qué estoy haciendo mal? ¿Es posible en general?

No hay .join() método .join() en el lado del cliente. Las habitaciones son puramente una construcción del lado del server y el cliente no sabe nada sobre ellas.

Su primer bloque de código es la forma deseada de hacer las cosas. Usted envía al server un post de su layout pidiéndole que se una al socket en una sala y el .join() se ejecuta en el lado del server.

Esto debería ser lo que necesitas. No dude en pasar el nombre de la habitación que desee a través del cliente. Solo el server puede manejar la asignación de un socket a una sala.

Servidor:

  io.sockets.on('connection', function(socket) { socket.on('join', function(room) { socket.join(room); }); }); 

Cliente:

  socket.emit('join', roomNum); 

Esto se logra fácilmente. Todo lo que necesita hacer es pasar un parámetro de consulta que el server entienda.

El siguiente ejemplo no está completamente probado, pero la idea funcionará. En este ejemplo, el nombre de la habitación se determina desde window.location.href en el cliente.

Cliente

 // Last segment of path is roomName var roomName = window.location.href.substr(window.location.href.lastIndexOf('/') + 1); var socket = io({ query: { roomName: roomName, }, }); 

Servidor

 var io = require('socket.io')(server); io.on('connection', function(socket) { var query = socket.handshake.query; var roomName = query.roomName; if(!roomName) { // Handle this as requinetworking } socket.join(roomName); });