2012-02-27 24 views
12

Ho implementato un'estensione per Chrome che consente di utilizzare la chat XMPP sulla connessione BOSH con il server punjab in esecuzione su un server remoto. È implementato usando la libreria Strophe javascript. Il problema che sto incontrando è quando ho più sessioni dello stesso utente (ad esempio due diversi browser sulla stessa macchina) Non riesco a ricevere e accedere alla seconda finestra della chat il messaggio che ho inviato dalla prima finestra di chat. Deve esserci un meccanismo che permetta questo. Posso in qualche modo ricevere messaggi che ho inviato ad altri utenti? Il problema può anche essere riprodotto su 2 o più macchine diverse, quindi anche questo deve essere risolto.XMPP più sessioni dello stesso problema utente

Grazie.

risposta

27

È necessario capire come funzionano i JID, quali sono le priorità e come inviare messaggi.

Un JID è della forma: [email protected]/resource

Le JID di utenti registrati devono essere unici. In genere, quando si utilizza un client Web, si assegna una risorsa casuale a ciascuna sessione in modo da non avere interferenze.

Ora, quando un utente invia un messaggio l'attributo to della stanza <message> specifica il destinatario del messaggio. Se la risorsa è parte del destinatario, solo quel JID riceverà il messaggio. Se il destinatario è un nuda JID (user @ dominio) allora le priorità entrano in gioco (vedi here):

  1. La risorsa con la massima priorità in un dato momento sarà quello che riceve i messaggi in arrivo.
  2. Se due o più risorse hanno la stessa priorità, tutte le risorse con tale priorità possono ricevere messaggi in arrivo o in base all'implementazione del server che si può ricevere in base a criteri specifici del server.
  3. Se tutte le risorse connesse hanno una priorità negativa, i messaggi in arrivo verranno accodati sul lato server finché una delle risorse non reimposta la priorità per essere positiva.

È possibile impostare la priorità (un numero intero in [-128, 127]) quando si invia la vostra presenza (vedi la rfc per la piena spec), ad esempio:

<presence> 
    <status>Learning XMPP</status> 
    <priority>1</priority> 
</presence> 
+3

Il numero 2 è impreciso. Può consegnare a tutti come definito o consegnare a un destinatario in base ad altri criteri specifici di implementazione. [Sezione 11.1 Stanze in entrata] (http://xmpp.org/rfcs/rfc3921.html#rules). Comunque una buona risposta. – Robin

+0

@Robin Aha, questo era per lo più a corto di memoria e ovviamente hai ragione. Ammending. – ggozad

4

Per farla breve!

Usa:

mXmppConnection.login (USERNAME, PASSWORD, StationName/NickName); 

E non:

mXmppConnection.login (USERNAME, PASSWORD); 

L'ultimo parametro chiamato risorsa, e rappresenta la stazione che si effettua il login da.

In questo modo è possibile accedere con lo stesso nome utente, ma ancora da 2 dispositivi.