@Sarclin

Как подключить пользователя к сокетам по invite-ссылке?

Пытаюсь сделать следующее:
Первый пользователь заходит на сайт (в примере localhost), копирует заранее сгенерированную ссылку вида "http://localhost:8080/id_комнаты" и отсылает другому пользователю.
Второй пользователь переходит по ссылке и они оба должны подключиться к одному сокету в комнате.
В чем загвоздка:
1) Сделать надо без(!) использования Express. Только node.js и socket.io.
2) Не знаю как обрабатывать в handler такой url.
var app = require('http').createServer(handler),
io = require('socket.io').listen(app),
fs = require('fs').
url = require('url');
var counter;
var rooms = []; //кол-во комнат
var urlRoom;
app.listen(8080);

function handler(req, res) {
	var path = url.parse(req.url).pathname;
	switch(path) {
		case '/':
			fs.readFile(__dirname + '/index.html',
			function(err, data) {
				if (err){
					res.writeHead(404);
					return res.end('Page doesn\'t exist - 404');
				} else {
					counter = 1;
					res.writeHead(200, {'Content-Type': 'text/html'});
					res.write(data,'utf8');
					res.end();
				}
			});
			break;

		default:
			res.writeHead(404);
			res.write('Page doesn\'t exist - 404');
			res.end();
			break;
	}
};

io.sockets.on('connection', function(socket) {
	var roomId = Math.round((Math.random()*1000000));
	addRoom(roomId);
	var room = getRoomById(roomId);

	socket.on('addNew', function(data) {
		urlRoom = data.url+''+roomId;
		console.log(urlRoom);
		var admin = false;
		if (isEmptyRoom(roomId)) {
			admin = true;
			socket.emit('inviteLink', {'inviteLink': urlRoom});
		} else {
			socket.broadcast.to(roomId).emit("join", {"start": "start"});
		}
		socket.join(roomId);
		socket.emit('start');
                room.user++;
	});
});

function addRoom(roomId) {
	var room = new Object();
	room.id = roomId;
	room.max = 2;
	room.user = 0;
	room.title = "";
	rooms.push(room);
}
function getRoomById(roomId) {
	for (i = 0; i<rooms.length; i++) {
		room = rooms[i];
		if (room.id == roomId) {
			return room;
		}
	}
	return null;
}
function isFullRoom(roomId) {
	var room = getRoomById(roomId);
	if (room.user == 2) {
		return true;
	} else {
		return false;
	}
}
function isEmptyRoom(roomId) {
	var room = getRoomById(roomId);
	if (room.user == 0) {
		return true;
	} else {
		return false;
	}
}
  • Вопрос задан
  • 287 просмотров
Решения вопроса 1
@Sarclin Автор вопроса
Решил. Если вдруг кому понадобится - пример как можно решить. Здесь ограничение на 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>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы