2016-12-11 6 views
0

После подключения к серверу каждый раз, когда Data приходит от этой связи (Socket.on('data',...)), сервер извлекает UserID из Data и проверить ClientList (массив объектов сокетов), чтобы увидеть, если сокет с этим UserID существует в ClientList, если нет: прибавляет UserID как объект Socket, а затем добавляет Socket объект до Client list.NodeJs Программирование сокетов, как обрабатывать и управлять сокетами? (Без использования socket.io) Каков эффективный способ?

Таким образом, когда пользователь с ID = 1 хочет отправить сообщение пользователю с ID = 2, поиск сервера для Розетка с UserID = 2 в ClientList, чтобы найти правильный Socket и отправить пользователь 1 в сообщение найденных Socket (пользователя 2).

Я пытаюсь выполнить это без использования socket.io! Вот что сделал мой работодатель! :))

Теперь мой вопрос: я делаю это правильно? Эффективно ли проверять массив ClientList (каждый раз, когда соединение отправляет данные), чтобы узнать, существует ли этот UserID в ClientList? если нет, то каков правильный и эффективный способ? у меня нет проблем с моим кодом, и он работает. но что, если есть тысячи соединений?

Любой пример кода, пример или ссылка будут оценены. Спасибо.

вот псевдо-код:

var net = require('net'); 
var Server = net.createServer(); 
var myAuth = require('./myAuth'); 
var ClientList = []; 

Server.on('connection', function(Socket){ 

    Socket.UserData = {}; // I want to add user data as a property to Socket 
    Socket.on('data', function (Data) { 

      var userID = myAuth.Authenticate_and_getUserID(Data); 

      if(userID != undefined){ 
       var found = false; 
       ClientList.filter(function(item){ 
        // check if Socket is in ClientList 
        if(item.UserData.ID == userID){ 
         // client was connected before 
         found = true; 
        } 
       }); 

       if(!found){ 
        // this is a new connection, Add it to ClientList 
        Socket.UserData.ID = userID; 
        ClientList.push(Socket); 
       } 
    } 

    Socket.once('close', function(has_error){ 
     var index = ClientList.indexOf(Socket); 
     if (index != -1){ 
      ClientList.splice(index, 1); 
      console.log('Client closed (port=' + Socket.remotePort + ').'); 
     } 
    }); 

}); 

UPDATE для уточнения:

это эффективный смотреть в ClientList каждый раз, когда Data подходит к серверу, чтобы проверить на receiverID (наличие приемника) и обновить ClientList с текущим подключением UserID, если не существует?

Как я могу управлять новыми подключениями (пользователями) и хранить их на сервере для позже использовать, когда число пользователей составляет тысячи или миллионы! НЕ 10 или 100. Как это делает socket.io?

позже обыкновений может быть:

  • проверка, чтобы увидеть, если один конкретный пользователь находится в сети (есть объект в ClientList) сообщение в реальном времени

  • отправить пользователю, если он/она онлайн

  • и т.п. , ,

+0

Попробуйте технологии очереди сообщений, такие как mqtt или rabbitmq – Jain

+0

@Jain спасибо за ваше предложение, но как насчет поиска в 'ClientList'? Использует ли 'mqtt' эту часть? Я обновил свой вопрос. –

ответ

0

На самом деле я делаю это неправильно!

Массивы в JavaScript передаются по ссылке! Поэтому нет необходимости обновлять ClientList каждый раз при отправке Socket-данных.

Therefor изменения кода, как следующее:

var net = require('net'); 
var Server = net.createServer(); 
var myAuth = require('./myAuth'); 
var ClientList = []; 

Server.on('connection', function(Socket){ 

    ClientList.push(Socket); 
    Socket._isAuthorized = false; 

    // when socket send data for the first time 
    // it gets authenticated and next time it send data 
    // server does not authenticate it 

    Socket.on('data', function (Data) { 

      var userID = getUserID(Data); 

      if(Socket._isAuthorized != true){ 
       if(authenticate(Socket)){ 
        Socket._isAuthorized = true; 
        Socket._userID = userID; 
        return; 
       } 
      } 
      // do something with data... 
    } 

    Socket.once('close', function(has_error){ 
     var index = ClientList.indexOf(Socket); 
     if (index != -1){ 
      ClientList.splice(index, 1); 
      console.log('Client closed (port=' + Socket.remotePort + ').'); 
     } 
    }); 

}); 

И его эффективно!