Vodič za XMPP Smack klijenta

1. Uvod

XMPP je bogat i složen protokol za razmjenu trenutnih poruka.

Umjesto da vlastitog klijenta pišemo ispočetka, u ovom uputstvu ćemo pogledati Smack, modularni i prijenosni XMPP klijent otvorenog koda napisan na Javi koji je za nas učinio velik dio teškog dizanja

2. Ovisnosti

Smack je organiziran u nekoliko modula kako bi pružio veću fleksibilnost, tako da lako možemo uključiti značajke koje su nam potrebne.

Neki od njih uključuju:

  • XMPP preko TCP modula
  • Modul za podršku mnogim proširenjima definiranim od strane XMPP Standards Foundation
  • Podrška naslijeđenih proširenja
  • Modul za otklanjanje pogrešaka

Sve podržane module možemo pronaći u XMPP-ovoj dokumentaciji.

Međutim, u ovom uputstvu ćemo se samo poslužiti tcp, im, proširenja, i java7 moduli:

 org.igniterealtime.smack smack-tcp org.igniterealtime.smack smack-im org.igniterealtime.smack smack-extensions org.igniterealtime.smack smack-java7 

Najnovije verzije možete pronaći na Maven Central.

3. Postavljanje

Da bismo testirali klijenta, trebat će nam XMPP poslužitelj. Da bismo to učinili, stvorit ćemo račun na jabber.hot-chilli.net, besplatnoj usluzi Jabber / XMPP za sve.

Nakon toga možemo konfigurirati Smack pomoću XMPPTCPConnectionConfiguration klasa koja pruža graditelju za postavljanje parametara veze:

XMPPTCPConnectionConfiguration config = XMPPTCPConnectionConfiguration.builder () .setUsernameAndPassword ("baeldung", "baeldung") .setXmppDomain ("jabb3r.org") .setHost ("jabb3r.org") .build ();

Graditelj nam omogućuje postavljanje osnovnih podataka potrebnih za uspostavljanje veze. Ako je potrebno, možemo postaviti i druge parametre kao što su port, SSL protokoli i vremenska ograničenja.

4. Veza

Uspostavljanje veze jednostavno se postiže pomoću XMPPTCPConnection razred:

SažetakXMPPConnection veza = novi XMPPTCPConnection (config); connection.connect (); // Uspostavlja vezu s poslužiteljem connection.login (); // Prijava 

Klasa sadrži konstruktor koji prihvaća prethodno izgrađenu konfiguraciju. Također pruža metode povezivanja s poslužiteljem i prijave.

Jednom kada se veza uspostavi, možemo koristiti Smackove značajke, Kao razgovor, koji ćemo opisati u sljedećem odjeljku.

U slučaju da je veza iznenada prekinuta, Smack će se prema zadanim postavkama pokušati ponovno povezati.

The ReconnectionManager pokušat će se odmah ponovo povezati s poslužiteljem i povećati kašnjenje između pokušaja jer uzastopna ponovna povezivanja i dalje zakazuju.

5. Chat

Jedna od glavnih značajki knjižnice je - podrška za chat.

Koristiti razgovor klasa omogućuje stvaranje nove niti poruka između dva korisnika:

ChatManager chatManager = ChatManager.getInstanceFor (veza); EntityBareJid jid = JidCreate.entityBareFrom ("[e-pošta zaštićena]"); Chat chat = chatManager.chatWith (jid);

Imajte na umu da za izgradnju a razgovor koristili smo a ChatManager i, očito, odredio s kim razgovarati. Ovo drugo postigli smo pomoću EntityBareJid objekt, kojiobavija XMPP adresu - ili JID - sastavljen od lokalnog dijela (baeldung2) i dio domene (jabb3r.org).

Nakon toga možemo poslati poruku pomoću poslati() metoda:

chat.send ("Zdravo!");

I primajte poruke postavljanjem slušatelja:

chatManager.addIncomingListener (new IncomingChatMessageListener () {@Override public void newIncomingMessage (EntityBareJid from, Message message, Chat chat) {System.out.println ("New message from" + from + ":" + message.getBody ()); }});

5.1. Sobe

Kao i chat korisnika od kraja do kraja, Smack pruža podršku za grupne chatove korištenjem soba.

Postoje dvije vrste soba, instant sobe i rezervirane sobe.

Instant sobe dostupne su za neposredan pristup i automatski se izrađuju na temelju neke zadane konfiguracije. S druge strane, rezervirane sobe vlasnik sobe ručno konfigurira prije nego što bilo kome dozvoli ulazak.

Pogledajmo kako stvoriti instant sobu pomoću MultiUserChatManager:

Upravitelj MultiUserChatManager = MultiUserChatManager.getInstanceFor (veza); MultiUserChat muc = manager.getMultiUserChat (jid); Resourcepart room = Resourcepart.from ("baeldung_room"); muc.create (soba) .makeInstant ();

Na sličan način možemo stvoriti rezerviranu sobu:

Postavi vlasnike = JidUtil.jidSetFrom (novi String [] {"[email protected]", "[email protected]"}); muc.create (soba) .getConfigFormManger () .setRoomOwners (vlasnici) .submitConfigurationForm ();

6. Spisak

Još jedna značajka koju Smack pruža je mogućnost praćenja prisutnosti drugih korisnika.

S Roster.getInstanceFor (), možemo dobiti a Spisak imena primjer:

Sastav popisa = Roster.getInstanceFor (veza);

The Spisak imena je popis kontakata koji predstavlja korisnike kao RosterEntry objekata i omogućuje nam organiziranje korisnika u grupe.

Možemo ispisati sve unose u Spisak imena koristiti getEntries () metoda:

Unosi u zbirku = roster.getEntries (); za (unos RosterEntry: unosi) {System.out.println (unos); }

Štoviše, omogućuje nam osluškivanje promjena u njegovim unosima i podacima o prisutnosti pomoću a Slušatelj rostera:

roster.addRosterListener (new RosterListener () {public void entriesAdded (Address collection) {// handle new entries} public void entriesDeleted (Address collection) {// handle izbrisani unosi} public void entudapdated (adrese zbirke) {// handle updated entries } javna prazna prisutnostChanged (prisutnost prisutnosti) {// obraditi promjenu prisutnosti}});

Također pruža način zaštite privatnosti korisnika osiguravajući da se samo odobreni korisnici mogu pretplatiti na popis. Da bi to učinio, Smack implementira model zasnovan na dopuštenjima.

Postoje tri načina za rješavanje zahtjeva za pretplatu na prisutnost s Roster.setSubscriptionMode () metoda:

  • Roster.SubscriptionMode.accept_all - Prihvatite sve zahtjeve za pretplatu
  • Roster.SubscriptionMode.reject_all - Odbijte sve zahtjeve za pretplatu
  • Roster.SubscriptionMode.manual - Zahtjeve za pretplatu na prisutnost obrađujte ručno

Ako odlučimo ručno obrađivati ​​zahtjeve za pretplatu, morat ćemo registrirati a StanzaListener (opisano u sljedećem odjeljku) i rukujte paketima s Prisutnost.Tip. pretplata tip.

7. Stanca

Uz chat, Smack nudi fleksibilni okvir za slanje strofe i preslušavanje dolaznih.

Da pojasnim, strofa je diskretna semantička jedinica značenja u XMPP-u. To su strukturirane informacije koje se iz jednog entiteta u drugi šalju putem XML toka.

Možemo prenijeti a Strofa kroz a Veza koristiti poslati() metoda:

Prisutnost stanze = nova prisutnost (Presence.Type.subscribe); connection.sendStanza (prisutnost);

U gornjem primjeru poslali smo datoteku Prisutnost strofa pretplatiti se na popis.

S druge strane, za obradu dolaznih strofa, knjižnica nudi dvije konstrukcije:

  • StanzaCollector
  • StanzaListener

Posebno, StanzaCollector čekajmo sinkrono nove strofe:

StanzaCollector kolektor = connection.createStanzaCollector (StanzaTypeFilter.MESSAGE); Strofa strofa = kolektor.nextResult ();

Dok StanzaListener je sučelje za asinkrono obavještavanje o dolaznim strofama:

connection.addAsyncStanzaListener (new StanzaListener () {public void processStanza (Stanca stanza) baca SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {// obrađuje stanzu}}, StanzaTESSAGEFilter;

7.1. Filteri

Štoviše, knjižnica nudi ugrađeni skup filtara za obradu dolaznih strofa.

Strofu možemo filtrirati prema vrsti StanzaTypeFilter ili putem osobne iskaznice sa StanzaIdFilter:

StanzaFilter messageFilter = StanzaTypeFilter.MESSAGE; StanzaFilter idFilter = novi StanzaIdFilter ("123456");

Ili, razlučujući prema određenoj adresi:

StanzaFilter fromFilter = FromMatchesFilter.create (JidCreate.from ("[email protected]")); StanzaFilter toFilter = ToMatchesFilter.create (JidCreate.from ("[e-pošta zaštićena]"));

I možemo koristiti logički operator filtra (IFilter, IliFilter, NotFilter) za stvaranje složenih filtara:

StanzaFilter filter = novi AndFilter (StanzaTypeFilter.Message, FromMatchesFilter.create ("[e-pošta zaštićena]"));

8. Zaključak

U ovom smo članku pokrili najkorisnije klase koje Smack nudi s police.

Naučili smo kako konfigurirati knjižnicu za slanje i primanje XMPP strofe.

Poslije smo naučili kako se rukuje grupnim chatovima pomoću ChatManager i Spisak imena značajke.

Kao i obično, svi uzorci koda prikazani u ovom vodiču dostupni su na GitHubu.