2012-02-27 10 views
2

私はNodeとRedisを使い慣れていますので、ここで重要なことがないと私を許してください。私はnode_redisクライアントを使って、RedisにNode.jsのnet.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); 'undefined'として記録されます。 また、 net.Socket(obj).write( "asdasdasd");私とエラーを言ってくれます:

エラー:このソケットは閉じています。

私の質問は、Redisにこのような方法でソケットを保存し、検索時に動作することを期待できますか?これを行う正しい/より良い方法がありますか?

P.S. net.SocketへのキャストなしでSocketを取得しようとしましたが、それでも何もできませんでした。

答えて

2

ソケットとソケットAPI(Berkeley Socketsなど)は、特別なシステム固有のリソースを本質的に処理します。このリソースは、リモートシステムに格納または参照することは意味がありません。

実際にはソケットはfile descriptorsによって一意に識別されることがよくありますが、後でアクセスできるように、その小さな一意の整数をデータベースに簡単に格納できます。ただし、その整数はそのプロセスインスタンス内のそのソケットの有効期間中のみ意味を持ちます。このような戦略には、主にソケットファイル記述子番号の一時的な性質に関係していることがあります。

+0

それは暗闇の中でショットだようにそれは見えません。 IPアドレスも使用できますが、クライアントはNATの背後に隠れています。私は保存しているIPアドレスへの新しい接続を開くことを躊躇しています。 –

0

IPアドレスは、別のハッシュキー(connectionではなく、ip)にあります。ですから、そのキーから読み込んだ値を得るには:

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

はい、私はちょうどそれを読むことができる、そして何かのためにそれを使用しています。しかし、私は接続自体を直接使用したいと考えていました。 –

2

as @maericsと言っても、赤字ストアのみの文字列です。あなたのソケットデータは破壊され、答えとして未定義となります。

このようにソケットを保管することができます。

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); 
関連する問題