节点 xmpp 消息未发送到正确的目的地

Node xmpp messages are not sent to correct destination

我正在使用 node-xmpp 服务器作为 2 clients:Psi 和 Spark.I 的聊天服务器,为每个 client.I 想要从 Psi 帐户发送消息到 Spark 的人注册一个帐户account.Every 当我从一个帐户发送消息时,同一帐户收到 message.I 想将朋友添加到我的列表(我不知道为什么不起作用..可能没有实现)和使用节点 xmpp server/examples/server-and-client.js.Thanks 发送消息 correctly.I 以获得建议。

使用正确的客户端连接发送消息,即

1).将认证时客户端的所有连接存储在一个数组中。
2).当消息到来时,找到与消息节中的 "to" 字段关联的正确客户端。
var receiverCleint = getClient(msgStanza.attrs.to)
3). return 正确的客户端并通过该客户端发送消息。
receiverCleint.send(消息节)

我也在做同样的演示,我唯一担心的是当更多的用户添加时这将是一个问题,因为它必须通过所有客户端迭代每条消息。

感谢任何更好的方法。

代码:

var clients = new Array();

c2sRouter.on("connection", function(client){

client.on("register", function(opts, cb){
    console.log("client server", "register");
})

client.on("authenticate", function(opts, cb){
    console.log("client server", "authenticate");

    if(opts.password === "tushar" || opts.password === "tushar1"){
        clients.push(client);
        cb(null, opts);
    }else{
        cb(false, opts);
    }
})

client.on("online", function(){
    console.log("client server", "online");

})

client.on("stanza", function(stanza){
    console.log("client server", stanza.toString());

    if(stanza.is("message")){
        var receiverClient = getClient(stanza.attrs.to)
        if(receiverClient === undefined){
            client.send(stanza);
        } else {
            receiverClient.send(stanza);
        }
    }
})

client.on("disconnect", function(){
    console.log("client server", "disconnect");

})
})

var getClient = function (to) {
var clientLength = clients.length;
var client
var clientId;
for(var i = 0; i < clientLength; i++){
    client = clients[i];
    clientId = client.jid.user + "@" + client.jid.domain
    if(to.indexOf(clientId) == 0){
        return client;
    }
}
}

这个完整的代码对我来说工作得很好:

var xmpp = require('node-xmpp-server');

function generateRoster(jid, name, id, to) {
    // This is a roster request, we create the response node
    var roster = new xmpp.Element('iq', {
        id: id,
        to: to,
        type: 'set'
    });

    roster.c('query', {xmlns: 'jabber:iq:roster', ver: 'ver13'})// We add a children tag `query`, with the two attribute xmlns and ver
        .c('item', { // We add a children 'Item'
            jid: jid, // We send the jid and the name
            name: name,
            subscription: 'both'
        }).c('group').t('Connected Clients'); // We add it to the 'Connected Clients' group

    return roster;
}

var startServer = function (done) {
    // Sets up the server.
    server = new xmpp.C2S.TCPServer({
        port: 5222,
        domain: 'localhost'
    });

    var connectedUsers = [];
    var clientsHandles = {};

    // On connection event. When a client connects.
    server.on('connection', function (client) {
        var userJid = null;
        // That's the way you add mods to a given server.

        // Allows the developer to register the jid against anything they want
        client.on('register', function (opts, cb) {
            console.log('REGISTER');
            console.log(cb);
            cb(false)
        });

        // Allows the developer to authenticate users against anything they want.
        client.on('authenticate', function (opts, cb) {
            //console.log('server:', opts.username, opts.password, 'AUTHENTICATING')
            if (opts.password === 'secret') {
                //console.log('server:', opts.username, 'AUTH OK')
                cb(null, opts)
            }
            else {
                //console.log('server:', opts.username, 'AUTH FAIL')
                cb(false)
            }
        });

        client.on('online', function () {
            userJid = client.jid.user + '@' + client.jid.domain + '/' + client.jid.resource;
            console.log(userJid + 'ONLINE');

            for (var i = 0; i < connectedUsers.length; i++) {
                var myRoster = generateRoster(userJid, userJid, 'myRandomId', connectedUsers[i]);

                if (clientsHandles[connectedUsers[i]]) {
                    clientsHandles[connectedUsers[i]].send(myRoster);
                    console.log("Sending my new infos to ", connectedUsers[i]);
                }
            }

            connectedUsers.push(userJid);
            client.jid.userJid = userJid;
            clientsHandles[userJid] = client;
        });

        // Stanza handling
        client.on('stanza', function (stanza) {
            if (stanza.is('message') && (stanza.attrs.type !== 'error')) {
                if (clientsHandles[stanza.attrs.to]) {
                    clientsHandles[stanza.attrs.to].send(stanza);
                }
            }
            else if (stanza.is('presence')) {
                // We loop through the user list
                for (var j = 0; j < connectedUsers.length; j++) {
                    console.log(stanza.toString());
                    var jid = connectedUsers[j];
                    stanza.to = jid;
                    clientsHandles[jid].send(stanza);
                }
            }
            else if (stanza.is('iq') && stanza.attrs.type == 'get') {
                for (var i = 0; i < stanza.children.length; i++) {
                    if (stanza.children[i].name == 'query' && stanza.children[i].attrs.xmlns == 'jabber:iq:roster') {

                        // We loop through the user list
                        for (var j = 0; j < connectedUsers.length; j++) {

                            var roster = generateRoster(connectedUsers[j], connectedUsers[j], stanza.attrs.id, stanza.attrs.from);
                            client.send(roster); // We send it back to the client
                        }

                    }
                }
                client.send(stanza);
            }
            else {
                client.send(stanza);
            }
        });

        // On Disconnect event. When a client disconnects
        client.on('disconnect', function () {
            if (userJid) {
                console.log(userJid, "DISCONNECTED");
                connectedUsers.splice(connectedUsers.indexOf(userJid), 1);
                delete clientsHandles[userJid];
            }
        });

    });

    server.on('listening', done)
};

startServer(function () {
    console.log("Server running");
});

当消息节到达时,我检查接收器是否已连接,如果是,我将节发送给它。