我是Node和Redis的新手,所以请原谅我,如果我在这里缺少一些关键的东西。我试图使用node_redis客户端在Redis中存储Node.js net.Socket对象,因此我可以重用先前在此Socket上建立的连接。 我将套接字存储为值作为“用户”集的一部分:
client.sadd("users", username); //username is a string
client.hmset(username, "ip", socket.remoteAddress, "connection", net.Socket(socket));
在另一点上,我正在检索此套接字:
client.smembers("users", function(err, replies) {
replies.forEach(function(reply,i){
if(recipient == reply) { //recipient is the username i've got
client.hget(reply, "connection", function(err, obj) {
console.log("socket's remoteaddress = " + net.Socket(obj).remoteAddress);
net.Socket(obj).write("asdasdasd");
});
}
});
});
但是,: net.Socket(OBJ).remoteAddress);记录为'undefined'。 也, net.Socket(OBJ).WRITE( “asdasdasd”);给了我错误的说法:
错误:此套接字已关闭。
所以我想我的问题是 - 你能在Redis中以这种方式存储套接字并希望它们能够在检索时工作吗?有没有正确/更好的方法来做到这一点?
P.S。我尝试检索Socket没有转换为net.Socket,它仍然没有做任何好事。
答案 0 :(得分:3)
套接字和套接字API(例如Berkeley Sockets)本质上处理特定于系统的特定资源,在远程系统上存储或引用它们是没有任何意义的,甚至是为此而序列化。 / p>
虽然实际上套接字通常由file descriptors唯一标识,因此您可以轻松地将这个小的唯一整数存储在数据库中以供以后访问;但是,该整数仅在该流程实例中该套接字的活动生命周期内有意义。像这样的策略将充满挑战,主要与套接字文件描述符号的瞬态特性有关。
答案 1 :(得分:3)
正如@maerics所说,redis只存储字符串。所以你的套接字数据将被销毁,并且会给出未定义的答案。
你可以这样存储你的插座。
var OBJECT = Object.prototype;
OBJECT.rhash = {};
OBJECT.rset = function(id, object) {
OBJECT.rhash[id] = object;
return id;
};
OBJECT.rget = function(id) {
return OBJECT.rhash[id];
};
这将存储对该对象的引用并再次重用它。
var id = OBJECT.rset("a123",socket);
var ref = OBJECT.rget("a123");
console.log(ref.remoteAddress);
答案 2 :(得分:0)
关于IP地址,它位于不同的哈希键上(不是connection
,而是ip
)。因此,要获得您刚从该键读取的值:
client.hget(reply, "ip", function(err, obj) {
console.log("socket's remoteaddress = " + obj);
});