2013-09-25 19 views
9

faccio i primi passi nelle js nodo e XMPPNodeJS del server XMPP

Ho bisogno di eseguire sul server XMPP su js nodo per la messaggistica

Ecco il processo: Io uso server del nodo-XMPP https://github.com/astro/node-xmpp eseguire l'esempio di un server (/examples/c2s.js) unirsi al server con due client (client testati su altri server jabber - funziona e i messaggi stanno inviando)

I client hanno l'autorizzazione sul mio server. Ma quando invio di un messaggio da un client a un altro, il messaggio arriva al server (lo vedo nei log) e che è stato il messaggio non arriva al destinatario

I don `t sapere dove cercare per il problema configurazione del server ? routing? la messaggistica potrebbe essere necessaria per aggiungerti?

aiuto me plz

il mio codice del server (con esempi)

var xmpp = require('../lib/node-xmpp'); 

var c2s = new xmpp.C2SServer({ 
    port: 5222, 
    domain: 'localhost' 

}); 

// On Connect event. When a client connects. 
c2s.on("connect", function(client) { 
    c2s.on("register", function(opts, cb) { 
     console.log("REGISTER"); 
    cb(true); 
    }); 

    client.on("authenticate", function(opts, cb) { 
     console.log("AUTH" + opts.jid + " -> " +opts.password); 
    cb(null); 
    }); 

    client.on("online", function() { 
     console.log("ONLINE"); 
     client.send(new xmpp.Message({ type: 'chat' }).c('body').t("Hello there, little client.")); 
    }); 

    client.on("stanza", function(stanza) { 
     console.log("STANZA" + stanza); 

    }); 

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

}); 

Ho un server e connettersi ad esso da questo codice

var xmpp = require('../lib/node-xmpp'); 
var argv = process.argv; 

if (argv.length < 6) { 
    console.error('Usage: node send_message.js <my-jid> <my-password> <my-text> <jid1> [jid2] ... [jidN]'); 
    process.exit(1); 
} 

var cl = new xmpp.Client({ jid: argv[2], password: argv[3] }); 

cl.addListener('online', 
    function() {argv.slice(5).forEach(
     function(to) {cl.send(new xmpp.Element('message', { to: to,type: 'chat'}).c('body').t(argv[4])); 
     }); 

     // nodejs has nothing left to do and will exit 
     // cl.end(); 
    }); 

cl.addListener('stanza', 
    function(stanza) { 
     if (stanza.is('message') && 
      // Important: never reply to errors! 
      stanza.attrs.type !== 'error') { 
      console.log("New message"); 
      // Swap addresses... 
      stanza.attrs.to = stanza.attrs.from; 
      delete stanza.attrs.from; 
      // and send back. 
      cl.send(stanza); 
     } 
    }); 

cl.addListener('error', 
    function(e) { 
     console.error(e); 
     process.exit(1); 
    }); 
+0

Si prega di inviare il codice problematico, altrimenti non abbiamo informazioni e sarà solo indovinando! – MattJ

+0

Stai sostituendo il simbolo con il da prima dell'invio? – Robert

risposta

1

Non sono un esperto su nessuno nodo .js né xmpp. Ma leggendo il tuo codice. Presumo che la "stanza" sia l'evento in cui un cliente ha inviato un messaggio. L'hai chiesto di registrare il messaggio, ma non hai fornito istruzioni su come instradarlo al destinatario. È necessario suddividere il messaggio ricevuto sul server nel corpo del messaggio e nel destinatario e chiedere al server di inviarlo al destinatario.

0

In "autenticarsi", un argomento non può essere sufficiente per una richiamata?

NG: 
cb(null); 

OK: 
cb(null, opts); 
1

Alex hai usato C2SServer che collega uno stream tra un server e un client. Quando si invia un messaggio da un client a un altro, si arriva al server. Ora è sua responsabilità affidare il sever al relay attuale.

Una soluzione possibile è mantenere l'oggetto client è un oggetto globale corrispondente ai propri jid quando il client è autenticato, quando si ottiene un messaggio per quel client è possibile ottenere quello dalla variabile globale e instradare il messaggio al client reale mantenuto in globale variabile.

5

La risposta breve: cambiare cb(null) a cb(null, opts).

La risposta lunga:

  1. client.on("authenticate", function(opts, cb) {...}) registri quello che il server fare quando il client tenta di autenticarsi. All'interno di node-xmpp, cercherà prima il meccanismo di autenticazione e il meccanismo chiamerà il callback e recupererà i risultati dell'autenticazione tramite cb.

  2. Per impostazione predefinita, viene utilizzata l'autenticazione Plain. Puoi controllare come funziona qui: https://github.com/node-xmpp/node-xmpp-server/blob/master/lib/authentication/plain.js. Con Plain il opts memorizza il jid e la password.

  3. Quindi per informare node-xmpp che l'autenticazione non è riuscita/riuscita, è necessario esaminare mechanism, https://github.com/node-xmpp/node-xmpp-server/blob/master/lib/authentication/mechanism.js, ereditato da Plain. this.authenticate(this.extractSasl(auth), function (err, user) { if (!err && user) { self.success(user) } else { self.failure(err) } }) Qui, cb richiede due parametri. Quando err è nullo e user non è nullo, indica il successo dell'autenticazione. Altrimenti, fallito.

1

È possibile ottenere il messaggio di testo & JID del ricevitore dal server. Basta rompere la stanza nei seguenti modi e metterla davanti agli ascoltatori di errori: -

cl.on('stanza', function(stanza) { 
    if (stanza.is('message') && (stanza.attrs.type !== 'error')) { 
     var body = stanza.getChild('body'); 
     if (!body) { 
     return; 
     } 
     console.log(stanza.attrs.from+" Says: "+body.children[0]); 
    } 
});