Socket.io: Как однозначно идентифицировать соединение на клиенте и сервере?

Мое приложение поддерживает несколько клиентов socket.io с одного хоста (IP-адрес). Для диагностики мне нужно уметь сопоставлять логи клиента и сервера, чтобы определить, с каким клиентом общается сервер. Предоставляет ли socket.io способ уникальной идентификации соединения?

2 ответа

Решение

Что я делаю, так это то, что в /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), используя серверную часть MongoDB, размещенную на MongoLab для моей. В хранилище сеансов для каждого сеанса у вас может быть уникальное имя пользователя или какой-либо другой идентификатор, соответствующий этому сеансу. На самом деле, вы можете прикрепить любые данные, которые вы хотите к этому сеансу. Вот как бы вы их отличали.

Код, который я использую, выглядит следующим образом:

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:""});
        }
    });
});

Может быть, есть более элегантный способ сделать это, но это работает.

Вы можете использовать сессию + куки: вот библиотека, которую вы можете использовать или узнать из: session-socket.io. Вы найдете множество примеров на их странице README.

Другие вопросы по тегам