在Redis中存储和检索套接字

pgpifvop  于 2023-01-04  发布在  Redis
关注(0)|答案(3)|浏览(176)

我是第一次接触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的情况下取回套接字,但仍然没有任何效果。

2cmtqfgy

2cmtqfgy1#

套接字和套接字API(如Berkeley Sockets)本质上处理特定于系统的特殊资源,在远程系统上存储或引用这些资源没有任何意义,甚至在这方面进行序列化也没有任何意义。
尽管在现实中,套接字通常由file descriptors唯一标识,因此您可以轻松地将这个小的、唯一的整数存储在数据库中以供以后访问;然而,该整数只有在该进程示例中套接字的活动生命周期内才有意义,像这样的策略将充满挑战,主要与套接字文件描述符编号的瞬时特性有关。

r1wp621o

r1wp621o2#

正如@maerics所说,redis只存储字符串。2所以你套接字数据将被破坏,并给予未定义的答案。
你可以这样存放你的套接字。

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);
yeotifhr

yeotifhr3#

至于IP地址,它位于不同的哈希键上(不是connection,而是ip)。因此,要获取您刚刚从该键读取的值:

client.hget(reply, "ip", function(err, obj) {
   console.log("socket's remoteaddress = " +  obj);
});

相关问题