在连接上下文之外引用NodeJS Net Sockets

时间:2013-07-03 18:41:01

标签: node.js sockets

我需要能够让客户端使用NodeJS套接字进行连接,但之后能够将数据发送到特定的客户端。

以下是我现在正在做的事情的一个例子:

var net = require('net');
var sockets = [];

var server = net.createServer(function(c) {
    c.sock_id = sockets.push(c);
    c.on('close', function() {
        delete sockets[c.sock_id];
    });
});
server.listen(1234, function() {});


function send_to_socket(id,message) {
    sockets[id].write(message);
}

在我看来,这似乎不是正确的处理方法,特别是在套接字存储在像Redis这样的环境中。

有人可以说明处理这个问题的正确方法吗?

1 个答案:

答案 0 :(得分:0)

套接字应具有唯一标识符。如果在连接层上未唯一标识它们,则必须手动创建自己的标识。它可以是processId + increment或任何其他网络可靠的标识。

然后有一个有socket的worker,负责处理它的消息队列以及发送消息 Redis可以轻松存储套接字ID,但也必须存储此套接字绑定的工作者ID 然后,您需要在工作人员之间进行直接通信,以便能够相互发送消息。这可以通过Redis为工作者或套接字提供消息队列来完成,负责此套接字的工作人员将提取消息并处理它们以便发送。
或者,您可以通过ZeroMQ直接从工作人员到工作人员进行通信,并直接向他们发送消息。我会建议Redis解决方案的消息。即使它是单点输入,但这种解决方案将更加灵活可靠。

最好将套接字列表保存为键值对象,其中key为socket的id,值为 - socket或对象,提供更多信息并将其自身套接字。
要将数据附加到套接字,您应该只需向套接字对象添加值。