Решил. Если вдруг кому понадобится - пример как можно решить. Здесь ограничение на 2 пользователя в одной комнате и некоторая "защита" от подключения в не созданную комнату. Не допилил удаление комнаты после дисконнекта пользователя.
Сервер:var app = require('http').createServer(handler),
io = require('socket.io').listen(app),
fs = require('fs'),
url = require('url');
app.listen(8080);
function handler(req, res) {
var urlParse = url.parse(req.url);
if (urlParse.path == '/') {
//если пользователь зашел на главную
fs.readFile(__dirname + '/index.html',
function(err, data) {
if (err){
res.writeHead(404);
return res.end('Page doesn\'t exist - 404');
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
//отдаем страницу клиенту
res.write(data,'utf8');
res.end();
}
});
} else if (urlParse.search) {
fs.readFile(__dirname + '/index.html',
function(err, data) {
if (err){
res.writeHead(404);
return res.end('Page doesn\'t exist - 404');
} else {
res.writeHead(200, {'Content-Type': 'text/html'});
//отдаем страницу клиенту
res.write(data,'utf8');
res.end();
}
});
} else {
res.writeHead(404);
res.write('Page doesn\'t exist - 404');
res.end();
}
};
var rooms = [];
io.sockets.on('connection', function(socket) {
//событие подключение нового пользователя
socket.on('connect_new_user', function() {
//генерируем id комнаты
var room = Math.round(Math.random() * 1000000);
//подключаем сокет к комнате
socket.join(room);
//отправляем клиенту id комнаты
socket.emit('addRoom', {'room': room});
addRoom(room);
});
//событие подключение второго пользователя
socket.on('connect_second_user', function(data) {
//получаем к-во пользователей в комнате
var playersCount = io.clients(function(err, clients) {
if(err) throw error;
});
//если кол-во пользователей в комнате 2 или более - комната полна
if (playersCount.server.eio.clientsCount-1 >= 2) {
console.log('Room is full');
return;
}
if (!containsTheRoom(data.roomId)) {
socket.emit('message', {message: 'Room not found'});
} else {
//если нет - подключаем пользователя к комнате с переданным id
socket.join(data.roomId);
//отправляем сообщение всем
io.sockets.to(data.roomId).emit('message', {message: 'message for all'});
//и себе
socket.to(data.roomId).emit('message', {message: 'message for you'});
console.log('connect in room');
}
console.log(rooms);
});
});
function addRoom(roomId) {
rooms.push(roomId);
}
function containsTheRoom(roomId) {
for (var i=0; i < rooms.length; i++) {
if (rooms[i] == roomId) {
return true;
} else {
return false;
}
}
}
Клиент:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title></title>
<script src="/socket.io/socket.io.js"></script>
</head>
<body>
<script>
var socket = io.connect('http://localhost:8080');
socket.on('connect', function() {
var path = window.location.search;
if (path == '') {
socket.emit('connect_new_user');
} else {
socket.emit('connect_second_user', {'roomId': path.substr(1)});
}
});
socket.on('addRoom', function(data) {
document.querySelector('#output').innerHTML=
window.location.href+'?'+data.room;
});
socket.on('message', function(data) {
document.write(data.message);
});
</script>
<div id="output"></div>
</body>
</html>