【问题标题】:Socket.io: How to uniquely identify a connection on client and server?Socket.io:如何唯一标识客户端和服务器上的连接?
【发布时间】:2013-08-19 12:37:58
【问题描述】:

我的应用支持来自同一主机(IP 地址)的多个 socket.io 客户端。对于诊断,我需要能够关联客户端和服务器日志以识别服务器正在与哪个客户端通信。 socket.io 是否提供了唯一标识连接的方法?

【问题讨论】:

标签: javascript socket.io


【解决方案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:""});
        }
    });
});

也许有一种更优雅的方法可以做到这一点,但这确实有效。

【讨论】:

    【解决方案2】:

    您可以使用 session+cookies:这是一个您可以使用或学习的库:session-socket.io。 您会在他们的 README 页面上找到大量示例。

    【讨论】:

      猜你喜欢
      • 2014-09-11
      • 2022-11-02
      • 1970-01-01
      • 2019-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多