2013-08-17 203 views
0

我的應用程序支持來自同一主機(IP地址)的多個socket.io客戶端。對於診斷,我需要能夠關聯客戶端和服務器日誌以確定服務器正在與哪個客戶端通話。 socket.io是否提供了唯一標識連接的方法?Socket.io:如何唯一標識客戶端和服務器上的連接?

+0

我不確定這是否改變,但檢查此帖:[如何獲取客戶端中的socket.io客戶端的會話ID](http://stackoverflow.com/questions/6979992/how-to-get-get-會話ID-的插座-IO-客戶端在客戶端) – dc5

回答

1

我要做的是,/routes/socket.js內,我有這些添加到我的要求:

var thisApp = require('../app'); 
var cookieSig = require('express/node_modules/cookie-signature'); 
var cookie = require('cookie'); 
var connect = require('express/node_modules/connect') 
    , parseSignedCookie = connect.utils.parseSignedCookie; 

這個答案假設你有某種可以通過thisApp訪問的會話存儲。 thisStore。就我而言,在主app.js中,我使用kcbanner的connect-mongo(通過npm和github.com提供)使用MongoLab上的MongoDB後端爲我開設一個會話存儲。在會話存儲中,對於每個會話,您可以擁有一個唯一的用戶名,或與該會話一起使用的其他標識符。真的,你可以添加你想要的任何數據。這就是你如何區分他們的方式。

我使用的代碼如下所示:

module.exports = function (socket) { 
    socket.on('taste:cookie', function (data, callback) { 
    console.log("taste:cookie function running"); 

    //get the session ID 
    var sid = data.sid; 
    sid = parseSignedCookie(sid['connect.sid'], "mySecret"); 
    console.log("sid: ",sid); 

    //get the handshake cookie 
    var hssid = cookie.parse(socket.handshake.headers.cookie); 
    hssid = parseSignedCookie(hssid['connect.sid'], "mySecret"); 
    console.log("hssid: %s",hssid); 

    if(sid) { 
     if(sid['connect.sid']) { 
      sid = sid['connect.sid'].slice(2); 
      console.log("sliced the sid: %s",sid); 
      sid = cookieSig.unsign(sid, "mySecret"); 
      hssid = sid; 
     } 

     if(hssid != sid) { 
      console.log("browser cookie not set right; rectifying..."); 
      data.sid = hssid; 
      sid = hssid; 
     } 
     else console.log("browser cookie was set right"); 
    } 
    thisApp.thisStore.get(sid, function(err, gotsession) { 
     if(err || !gotsession) { 
      //handle error 
      return; 
     } else { 
      if(gotsession.username) { 
       callback(0, {username:gotsession.username}); 
      } 
      else callback(1, {username:""}); 
     } 
    }); 
}); 

也許有一個更優雅的方式來做到這一點,但這樣做的工作。

1

您可以使用session + cookies:以下是您可以使用或學習的圖書館:session-socket.io。 你會在他們的README頁面找到大量的例子。

相關問題