Sprievodca XMPP Smack Client

1. Úvod

XMPP je bohatý a komplexný protokol okamžitých správ.

Namiesto toho, aby sme od začiatku písali nášho vlastného klienta, v tomto výučbe sa pozrieme na Smack, modulárneho a prenosného klienta s otvoreným zdrojovým kódom XMPP napísaným v Jave to pre nás urobilo veľa ťažkého zdvíhania.

2. Závislosti

Program Smack je usporiadaný do niekoľkých modulov, ktoré poskytujú väčšiu flexibilitu, takže môžeme ľahko zahrnúť funkcie, ktoré potrebujeme.

Niektoré z nich zahŕňajú:

  • XMPP cez modul TCP
  • Modul na podporu mnohých rozšírení definovaných nadáciou XMPP Standards Foundation
  • Podpora starších rozšírení
  • Modul na ladenie

Všetky podporované moduly nájdeme v dokumentácii XMPP.

V tomto výučbe však iba využijeme tcp, im, rozšíreniaa java7 moduly:

 org.igniterealtime.smack smack-tcp org.igniterealtime.smack smack-im org.igniterealtime.smack smack-rozšírenia org.igniterealtime.smack smack-java7 

Najnovšie verzie nájdete na serveri Maven Central.

3. Inštalácia

Na otestovanie klienta budeme potrebovať server XMPP. Za týmto účelom si vytvoríme účet na jabber.hot-chilli.net, bezplatnej službe Jabber / XMPP pre všetkých.

Potom môžeme Smack nakonfigurovať pomocou XMPPTCPConnectionConfiguration trieda, ktorá poskytuje nástroj na nastavenie parametrov pripojenia:

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

Nástroj na vytváranie umožňuje nastaviť základné informácie potrebné na vykonanie pripojenia. V prípade potreby môžeme nastaviť aj ďalšie parametre, ako je port, protokoly SSL a časové limity.

4. Pripojenie

Vytvorenie spojenia sa dá jednoducho dosiahnuť pomocou XMPPTCPConnection trieda:

Pripojenie AbstractXMPPConnection = nové XMPPTCPConnection (konfigurácia); connection.connect (); // Nadviaže pripojenie k serveru connection.login (); // Prihlásiť sa 

Trieda obsahuje konštruktor, ktorý akceptuje predtým zostavenú konfiguráciu. Poskytuje tiež spôsoby pripojenia na server a prihlásenia.

Po nadviazaní spojenia môžeme využívať funkcie Smacku, Páči sa mi to chatovať, ktoré si popíšeme v nasledujúcej časti.

V prípade, že sa pripojenie náhle preruší, predvolene sa služba Smack pokúsi o opätovné pripojenie.

The ReconnectionManager sa pokúsi okamžite znova pripojiť k serveru a zvýšiť oneskorenie medzi pokusmi, pretože postupné opätovné pripojenia stále zlyhávajú.

5. Rozhovor

Jednou z hlavných funkcií knižnice je - podpora chatu.

Pomocou Chat trieda umožňuje vytvoriť nové vlákno správ medzi dvoma používateľmi:

ChatManager chatManager = ChatManager.getInstanceFor (pripojenie); EntityBareJid jid = JidCreate.entityBareFrom ("[chránený e-mailom]"); Chat chat = chatManager.chatWith (jid);

Upozorňujeme, že na vybudovanie a Chat použili sme a ChatManager a samozrejme určil, s kým sa má zhovárať. Posledné sme dosiahli použitím EntityBareJid objekt, ktorýzalomí adresu XMPP —aka JID— zložený z miestnej časti (baeldung2) a doménová časť (jabb3r.org).

Potom môžeme poslať správu pomocou poslať () metóda:

chat.send („Ahoj!“);

A prijímajte správy nastavením poslucháča:

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. Izby

Rovnako ako chat medzi koncovými používateľmi, Spoločnosť Smack poskytuje podporu skupinovým chatom využívaním miestností.

Existujú dva typy izieb, okamžité izby a rezervované izby.

Okamžité miestnosti sú k dispozícii pre okamžitý prístup a automaticky sa vytvárajú na základe nejakej predvolenej konfigurácie. Na druhej strane vyhradené miestnosti konfiguruje vlastník miestnosti manuálne predtým, ako ktokoľvek bude mať vstup.

Poďme sa pozrieť na to, ako vytvoriť okamžitú miestnosť pomocou MultiUserChatManager:

MultiUserChatManager manager = MultiUserChatManager.getInstanceFor (pripojenie); MultiUserChat muc = manager.getMultiUserChat (jid); Resourcepart room = Resourcepart.from ("baeldung_room"); muc.create (miestnosť) .makeInstant ();

Podobným spôsobom môžeme vytvoriť vyhradenú miestnosť:

Nastaviť vlastníkov = JidUtil.jidSetFrom (nový reťazec [] {"[chránený e-mailom]", "[chránený e-mailom]}}); muc.create (miestnosť) .getConfigFormManger () .setRoomOwners (vlastníci) .submitConfigurationForm ();

6. Súpiska

Ďalšou funkciou, ktorú Smack poskytuje, je možnosť sledovať prítomnosť ostatných používateľov.

S Roster.getInstanceFor (), môžeme získať a Zoznam inštancia:

Zoznam súpisiek = Roster.getInstanceFor (pripojenie);

The Zoznam je zoznam kontaktov, ktorý predstavuje používateľov ako RosterEntry objekty a umožňuje nám organizovať používateľov do skupín.

Môžeme vytlačiť všetky záznamy v Zoznam pomocou getEntries () metóda:

Záznamy zbierky = roster.getEntries (); pre (položka RosterEntry: entries) {System.out.println (položka); }

Ďalej nám umožňuje počúvať zmeny v jeho záznamoch a údajoch o prítomnosti pomocou a Zoznam poslucháčov:

roster.addRosterListener (new RosterListener () {public void entriesAdded (Collection addresses) {// handle new entries} public void entriesDeleted (Collection adries) {// handle deleted entries} public void entriesUpdated (Collection addresses) {// handle updated entries } public void presenceChanged (prítomnosť prítomnosti) {// zmena zmeny prítomnosti}});

Poskytuje tiež spôsob ochrany súkromia používateľov zabezpečením toho, aby sa na odber zoznamu mohli prihlásiť iba schválení používatelia. Za týmto účelom spoločnosť Smack implementuje model založený na oprávneniach.

Existujú tri spôsoby, ako vybaviť žiadosti o predplatné prítomnosti pomocou Roster.setSubscriptionMode () metóda:

  • Roster.SubscriptionMode.accept_all - Prijmite všetky žiadosti o predplatné
  • Roster.SubscriptionMode.reject_all - Odmietnuť všetky žiadosti o predplatné
  • Roster.SubscriptionMode.manual - Spracovať žiadosti o predplatné prítomnosti ručne

Ak sa rozhodneme vybavovať žiadosti o predplatné ručne, budeme musieť zaregistrovať a StanzaListener (popísané v nasledujúcej časti) a zachádzajte s paketmi s Presence.Type.subscribe typu.

7. Sloka

Okrem chatu poskytuje Smack flexibilný rámec na odosielanie strofy a počúvanie prichádzajúcej.

Aby sme to objasnili, strofa je v XMPP samostatnou významovou jednotkou. Sú to štruktúrované informácie, ktoré sa posielajú z jednej entity do druhej prostredníctvom toku XML.

Môžeme prenášať a Strofa cez a Pripojenie pomocou poslať () metóda:

Prítomnosť strofy = nová prítomnosť (Presence.Type.subscribe); connection.sendStanza (prítomnosť);

Vo vyššie uvedenom príklade sme poslali a Prítomnosť strofa na prihlásenie na odber zoznamu.

Na druhú stranu, na spracovanie prichádzajúcich strof, knižnica poskytuje dva konštrukty:

  • StanzaCollector
  • StanzaListener

Najmä StanzaCollector počkajme synchrónne na nové strofy:

Zberač StanzaCollector = connection.createStanzaCollector (StanzaTypeFilter.MESSAGE); Stanza stanza = collector.nextResult ();

Zatiaľ čo StanzaListener je rozhranie pre asynchrónne upozorňovanie na prichádzajúce stanzy:

connection.addAsyncStanzaListener (new StanzaListener () {public void processStanza (Stanza stanza) throws SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {// handle stanza}}, StanzaTypeFilter.MESSAGE);

7.1. Filtre

Navyše, knižnica poskytuje vstavanú sadu filtrov na spracovanie prichádzajúcich strof.

Stanzu môžeme filtrovať podľa typu pomocou StanzaTypeFilter alebo podľa dokladu s StanzaIdFilter:

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

Alebo podľa konkrétnej adresy:

StanzaFilter fromFilter = FromMatchesFilter.create (JidCreate.from ("[chránený e-mailom]")); StanzaFilter toFilter = ToMatchesFilter.create (JidCreate.from ("[chránený e-mailom]"));

Môžeme použiť operátor logického filtra (AndFilter, AleboFilter, NotFilter) na vytvorenie zložitých filtrov:

Filter StanzaFilter = nový AndFilter (StanzaTypeFilter.Message, FromMatchesFilter.create ("[chránený e-mailom]"));

8. Záver

V tomto článku sme sa venovali najužitočnejším triedam, ktoré Smack ponúka z police.

Naučili sme sa, ako nakonfigurovať knižnicu tak, aby mohla odosielať a prijímať stanzu XMPP.

Následne sme sa naučili, ako zvládnuť skupinové chaty pomocou ChatManager a Zoznam Vlastnosti.

Ako obvykle sú všetky ukážky kódu zobrazené v tomto tutoriále dostupné na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found