Хранение и извлечение сокетов в Redis - PullRequest
3 голосов
/ 27 февраля 2012

Я новичок в Node и Redis, так что прости меня, если я что-то упустил здесь. Я пытаюсь сохранить объект Node.js net.Socket в Redis, используя клиент node_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. Я попытался восстановить Socket без приведения к net.Socket, но он все равно ничего не дал.

Ответы [ 3 ]

3 голосов
/ 01 июня 2012

как сказал @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);
3 голосов
/ 27 февраля 2012

Сокеты и API-интерфейсы сокетов (например, Berkeley Sockets ) по своей природе обрабатывают специальные системные ресурсы, для которых просто не имеет смысла хранить или ссылаться на удаленную систему, или даже сериализовать для этого вопрос.

Хотя на самом деле сокеты часто уникально идентифицируются с помощью файловых дескрипторов , поэтому вы можете легко сохранить это небольшое уникальное целое число в базе данных для последующего доступа; однако это целое число будет иметь смысл только в течение активного времени жизни этого сокета в этом экземпляре процесса. Такая стратегия будет чревата проблемами, в основном связанными с переходной природой номера дескриптора файла сокета.

0 голосов
/ 27 февраля 2012

Что касается IP-адреса, он находится на другом хэш-ключе (не connection, а ip).Итак, чтобы получить значение, которое вы только что прочитали из этого ключа:

client.hget(reply, "ip", function(err, obj) {
   console.log("socket's remoteaddress = " +  obj);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...