2016-12-11 10 views
0

、この接続(Socket.on('data',...))から来るたびにDataは、サーバーがDataからUserIDを取り出し、このUserIDとソケットがClientListに存在し、そうでない場合はどうかを確認するために、ClientList(ソケットオブジェクトの配列)をチェック:追加しますUserIDSocketのプロパティとして追加し、SocketオブジェクトをClient listに追加します。 IDを持つユーザーは= 1がID = 2、右Socketを探し、見つかったSocketにユーザ1のメッセージを送信するためにClientListでユーザーID = 2とソケット用 サーバーの検索(ユーザーとユーザーにメッセージを送りたいのでNodeJsソケットの処理方法とソケットの管理方法は? (socket.ioを使わないで)効率的な方法は何ですか?サーバーへの接続後

2のソケット)。

socket.ioを使用せずにこれを達成しようとしています!それは私の雇用主が私にしたものです! :))

今私の質問です:私はこの権利をしていますか?このUserIDClientListに存在するかどうかを確認するのに、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が存在しますか?

新しい接続(ユーザ)を管理し、のサーバに保存する方法は、ユーザ数が何千人も何百万人の場合でもを使用してください。どのようにsocket.ioこれを行うのですか?

以降の使用法は次のようになります。彼/彼女がある場合

  • 1人の特定のユーザーがオンラインであるかどうかを確認するためのチェック(ClientList内のオブジェクトを持っている)

  • は、ユーザーにリアルタイムメッセージを送信しますオンライン

  • など。 。 。

+0

mqttやrabbitmqのようなメッセージキュー技術を試してください。 – Jain

+0

@Jainあなたの提案に感謝します。しかし、 'ClientList'部分の検索はどうですか? 'mqtt'を使ってその部分を削除していますか?私は私の質問を更新しました。 –

答えて

0

実際これは間違っています!

JavaScriptの配列は参照渡しです!したがって、ソケットがデータを送信するたびにClientListを更新する必要はありません。

次のようなコードの変更そのため

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 + ').'); 
     } 
    }); 

}); 

とその効率的!

関連する問題