我需要能够让客户端使用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这样的环境中。
有人可以说明处理这个问题的正确方法吗?
答案 0 :(得分:0)
套接字应具有唯一标识符。如果在连接层上未唯一标识它们,则必须手动创建自己的标识。它可以是processId + increment
或任何其他网络可靠的标识。
然后有一个有socket的worker,负责处理它的消息队列以及发送消息
Redis可以轻松存储套接字ID,但也必须存储此套接字绑定的工作者ID
然后,您需要在工作人员之间进行直接通信,以便能够相互发送消息。这可以通过Redis为工作者或套接字提供消息队列来完成,负责此套接字的工作人员将提取消息并处理它们以便发送。
或者,您可以通过ZeroMQ直接从工作人员到工作人员进行通信,并直接向他们发送消息。我会建议Redis解决方案的消息。即使它是单点输入,但这种解决方案将更加灵活可靠。
最好将套接字列表保存为键值对象,其中key为socket的id,值为 - socket或对象,提供更多信息并将其自身套接字。
要将数据附加到套接字,您应该只需向套接字对象添加值。