Javascript Socket.io:如何唯一标识客户端和服务器上的连接?
我的应用程序支持来自同一主机(IP地址)的多个socket.io客户端。对于诊断,我需要能够关联客户机和服务器日志,以确定服务器正在与哪个客户机通信。socket.io是否提供了唯一标识连接的方法?您可以使用session+cookies:这里有一个库,您可以使用或从中学习:。Javascript Socket.io:如何唯一标识客户端和服务器上的连接?,javascript,socket.io,Javascript,Socket.io,我的应用程序支持来自同一主机(IP地址)的多个socket.io客户端。对于诊断,我需要能够关联客户机和服务器日志,以确定服务器正在与哪个客户机通信。socket.io是否提供了唯一标识连接的方法?您可以使用session+cookies:这里有一个库,您可以使用或从中学习:。 你可以在他们的自述页面上找到很多例子。我所做的是在/routes/socket.js中,我将这些添加到我的需求中: var thisApp = require('../app'); var cookieSig = req
你可以在他们的自述页面上找到很多例子。我所做的是在/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访问。在我的例子中,在main 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:""});
}
});
});
也许有一种更优雅的方法可以做到这一点,但这确实有效。我不确定这是否有所改变,但请查看以下帖子: