Node xmpp messages are not sent to correct destination

戏子无情 提交于 2019-12-02 00:01:14

问题


I'm using node-xmpp server as a chat server for 2 clients:Psi and Spark.I register an account for every client.I want to send from Psi account a message to Spark account.Every time when i send a message from an account the same account receive the message.I want to add friend to my list(i don't know why doesn'w work..probably is not implemented) and to send messages correctly.I'm using node xmpp server/examples/server-and-client.js.Thanks for advices.


回答1:


This complete code work pretty well for me:

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");
});

When a message stanza arrives, I check wether the receiver is connected or not and if so I send the stanza to it.




回答2:


Send the message with the correct client connection i.e.

1). Store all the connection of the clients in an array at the time of authentication.
2). When a message come find the correct client associated with the "to" field in the message stanza.
var receiverCleint = getClient(msgStanza.attrs.to)
3). return the correct client and send the message through that client.
receiverCleint.send(msgStanza)

I am also working on the same demo, my only concern is when more user adds then it will be a problem as it has to iterate on each message through all clients.

Any better approach appreciated.

Code:

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;
    }
}
}


来源:https://stackoverflow.com/questions/32135501/node-xmpp-messages-are-not-sent-to-correct-destination

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!