У меня есть работающее приложение видеочата, которое использует WebRT C | Socket.IO | Node.js.
Я следовал примеру, который нашел на github. Теперь, посмотрев весь код и попытавшись понять его, я заметил что-то неправильное или неправильно понимаю.
Это соответствующий код сервера:
'use strict';
var os = require('os');
var nodeStatic = require('node-static');
var http = require('https');
var socketIO = require('socket.io');
var fs = require('fs');
var options = {
key: fs.readFileSync('../../wwwssl/certi.key.pem').toString(),
cert: fs.readFileSync('../../wwwssl/certi.pem').toString()
};
var fileServer = new(nodeStatic.Server)();
var app = http.createServer(options, function(req, res) {
fileServer.serve(req, res);
}).listen(8443); // was 443
var roomNow;
var clientsArray = {};
var io = socketIO.listen(app);
io.sockets.on('connection', function(socket) {
// convenience function to log server messages on the client
function log() {
var array = ['Message from server:'];
array.push.apply(array, arguments);
socket.emit('log', array);
}
socket.on('message', function(message) {
socket.to(roomNow).emit('message', message);
console.log('message | roomNow: ' + roomNow + ' message: ' + message);
});
socket.on('create or join', function(room) {
roomNow = room;
if(clientsArray[room] === undefined)
clientsArray[room] = [];
clientsArray[room].push(socket.id);
log('Received request to create or join room ' + room);
var numClients = clientsArray[room].length;
log('Room ' + room + ' now has ' + numClients + ' client(s)');
if (numClients === 1) {
socket.join(room);
io.sockets.in(room).emit('created', room, socket.id);
} else if (numClients === 2) {
io.sockets.in(room).emit('join', room);
socket.join(room);
io.sockets.in(room).emit('joined', room, socket.id);
} else { // max two clients
socket.emit('full', room);
}
});
});
Вот что я не совсем понимаю или могу ошибаться:
На сервере я определил var roomNow
и var clientArray
.
clientArray собирает все комнаты и клиентов , которые находятся в комнатах, вот пример:
{ room1 : [<socket id of user A>, <socker id of user B>],
room2 : [<socket id of user C>, <socker id of user D>]}
roomNow
установлен на join or create
и используется здесь: socket.to(roomNow).emit('message', message);
. Это используется для создания соединения, поэтому клиенты в той же комнате получают сообщения.
НО не неправильно ли менять roomNow каждый раз при join or create
? Это работает только в тестовых случаях или когда только несколько пользователей используют приложение. Если бы у меня были тысячи запросов, не было бы roomNow
перезаписано все время и все испортилось бы?
Не лучше ли было бы полностью удалить roomNow
и использовать socket.id клиента, чтобы найти правильный номер от clientArray
?