2012-01-03 4 views
1

私はsocket.io(バージョン:0.8.7)でユーザー間のバイコネクションを管理するnode.jsサーバーを実装しています。私はまだチャットパートナーがいないユーザーを格納する配列を使用します。ユーザーが新しいパートナーをリクエストすると、この配列内のユーザーが選択され、ユーザーがまだ接続されているかどうかが確認されます。そして、ここに私の問題があります:ユーザーのためのソケットクライアントを取得するには?

ユーザーがまだ接続されていても、そのユーザーのソケットクライアントを取得できません。

// An array of users that do not have a chat partner 
var soloUsers = []; 

var io = sio.listen(app); 

io.sockets.on('connection', function (socket) { 


    socket.on('sessionStart', function (message) 
    {  
     // Parse the incoming event 
     switch (message.event) { 

      // User requested initialization data 
      case 'initial': 
       ... 

     // User requested next partner 
     case 'next': 

     // Create a "user" data object for me 
     var me = { 
      sessionId: message.data.sessionId, 
      clientId: socket.sessionid 
     }; 

     var partner; 
     var partnerClient; 

     // Look for a user to partner with in the list of solo users 
     for (var i = 0; i < soloUsers.length; i++) 
     { 
      var tmpUser = soloUsers[i]; 

      // Make sure our last partner is not our new partner 
      if (socket.partner != tmpUser) 
      { 
       // Get the socket client for this user 
       partnerClient = io.sockets.clientsIndex[tmpUser.clientId]; 

       // Remove the partner we found from the list of solo users 
       soloUsers.splice(i, 1); 

       // If the user we found exists... 
       if (partnerClient) 
       { 
        // Set as our partner and quit the loop today 
        partner = tmpUser; 
        break; 
       } 
      } 
     } 

     ... 

私は次のエラーを取得する:私はのclientIdの出力(にconsole.logを)やった

partnerClient = io.sockets.clientsIndex[clientId]; 
            ^
TypeError: Cannot read property 'undefined' of undefined 

、それは間違いなくindefinedされる。ここに私のコードの抜粋です。さらに、私はAPIがsocket.ioバージョン0.8で変更されている可能性があり、もう "clientsIndex"メソッドを使用することはできないと考えています。誰かが交換を知っていますか?

ありがとうございました!

+0

partnerClientで達成しようとしていることは何ですか? – alessioalex

+0

パートナーを引き続きユーザーに割り当てる前に、パートナーがまだ接続されていることを確認したい。 –

+0

投稿を編集している間に回答を追加しました。ところで、クライアントの配列をループすることはあまり良くありません。たとえば、クライアント数が10.000の場合、どれほど遅いか想像してみてください。これは、Node.jsイベントループをブロックします。 – alessioalex

答えて

7

最良のことは、オブジェクト内の接続されたクライアントを追跡することです。ここで私はこれを達成する方法は次のとおりです。

var clients = {}; 

io.sockets.on('connection', function (socket) { 
    // remember the client by associating the socket.id with the socket 
    clients[socket.id] = socket; 
    socket.on('sessionStart', function (message) { 
    // get the socket.id of the partner on each message 
    var partner = message.from; 
    if (clients[partner]) { 
     // check if the partner exists and send a message to the user 
     clients[socket.id].emit('message', { from: partner, msg: message }); 
    } 
    } 

    socket.on('disconnect', function() { 
    delete clients[socket.id]; // delete the client from the list 
    }); 
} 

注:実際の本番アプリケーションで使用すると、正常にセッションデータをチェックしますと、ユーザー名とsocket.idで各クライアントを関連付けます。

関連する問題