2012-02-27 69 views
2

我是Node和Redis的新手,如果我在這裏丟失了一些至關重要的東西,請原諒我。我正嘗試在Redis中使用node_redis客戶端存儲Node.js net.Socket對象,以便可以重新使用先前在此Socket上創建的連接。 我儲存的插座,一個值作爲「用戶」的部分設置:在Redis中存儲和檢索套接字

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);記錄爲'未定義'。 另外, net.Socket(obj).write(「asdasdasd」);給我和錯誤說:

錯誤:此套接字已關閉。

所以我想我的問題是 - 你能否以這種方式在Redis中存儲套接字並期望它們在檢索時工作?有沒有一個正確/更好的方法來做到這一點?

P.S.我嘗試檢索套接字沒有投到net.Socket,它仍然沒有任何好處。

回答

2

套接字和套接字API(例如Berkeley Sockets)本質上處理特定系統特定的資源,在遠程系統上存儲或引用這些資源是沒有意義的,甚至無法序列化。

雖然在現實中,套接字通常由file descriptors唯一標識,因此您可以輕鬆地將該小的唯一整數存儲在數據庫中以供以後訪問;但是,該整數僅在該流程實例中該套接字的活動生命週期內纔有意義。像這樣的策略將會充滿挑戰,主要與套接字文件描述符編號的瞬態性有關。

+0

它看起來就像是在黑暗中拍攝。我也可以使用IP地址,但我的客戶端隱藏在NAT後面,而且我還有其他一些問題,這使我無法打開與存儲的IP地址的新連接。 – 2012-02-27 04:28:15

0

關於IP地址,它位於不同的散列鍵(不是connection,但是ip)。所以,讓你只需從閱讀的關鍵價值:

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

是的,我能夠閱讀這個很好,並用於其他的東西。但我希望直接使用連接。 – 2012-02-27 04:25:59

2

爲@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);