我是第一次接触Node和Redis,请原谅我遗漏了一些重要的东西。我尝试在Redis中存储一个Node.js net.Socket对象,使用node_redis客户端,这样我就可以重用之前在这个Socket上建立的连接。我将套接字存储为一个值,作为“users”集的一部分:
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.套接字(obj).write(“asdasdasd”);给我一个错误的说法:
错误:此套接字已关闭。
所以我想我的问题是-你能在Redis中用这种方式存储套接字并期望它们在检索时工作吗?有没有一种正确的/更好的方法来做到这一点?
另外,我试着在没有转换到net的情况下取回套接字,但仍然没有任何效果。
3条答案
按热度按时间2cmtqfgy1#
套接字和套接字API(如Berkeley Sockets)本质上处理特定于系统的特殊资源,在远程系统上存储或引用这些资源没有任何意义,甚至在这方面进行序列化也没有任何意义。
尽管在现实中,套接字通常由file descriptors唯一标识,因此您可以轻松地将这个小的、唯一的整数存储在数据库中以供以后访问;然而,该整数只有在该进程示例中套接字的活动生命周期内才有意义,像这样的策略将充满挑战,主要与套接字文件描述符编号的瞬时特性有关。
r1wp621o2#
正如@maerics所说,redis只存储字符串。2所以你套接字数据将被破坏,并给予未定义的答案。
你可以这样存放你的套接字。
这将存储对该对象的引用并再次重用它。
yeotifhr3#
至于IP地址,它位于不同的哈希键上(不是
connection
,而是ip
)。因此,要获取您刚刚从该键读取的值: