Útmutató az XMPP Smack klienshez

1. Bemutatkozás

Az XMPP gazdag és összetett azonnali üzenetküldő protokoll.

Ahelyett, hogy saját ügyfelünket írnánk a semmiből, ebben az oktatóanyagban megnézzük a Smack-et, egy Java-ban írt moduláris és hordozható nyílt forráskódú XMPP klienst ami a nehéz megemelés nagy részét megtette értünk.

2. Függőségek

A Smack több modulból áll, hogy nagyobb rugalmasságot nyújtson, így könnyen felvehetjük a szükséges funkciókat.

Ezek egy része a következőket tartalmazza:

  • XMPP TCP modulon keresztül
  • Az XMPP Standards Foundation által meghatározott számos kiterjesztést támogató modul
  • A régi bővítmények támogatása
  • Hibakeresési modul

Az összes támogatott modult megtaláljuk az XMPP dokumentációjában.

Ebben az oktatóanyagban azonban csak a tcp, im, kiterjesztések, és java7 modulok:

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

A legújabb verziók a Maven Central oldalon találhatók.

3. Beállítás

Az ügyfél teszteléséhez szükségünk lesz egy XMPP szerverre. Ehhez létrehozunk egy fiókot a jabber.hot-chilli.net oldalon, amely egy ingyenes Jabber / XMPP szolgáltatás mindenki számára.

Utána a Smack segítségével konfigurálhatjuk a XMPPTCPConnectionConfiguration osztály, amely egy építőt biztosít a kapcsolat paramétereinek beállításához:

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

A készítő lehetővé teszi számunkra, hogy beállítsuk a kapcsolat létrehozásához szükséges alapvető információkat. Szükség esetén egyéb paramétereket is beállíthatunk, például portot, SSL protokollokat és időtúllépéseket.

4. Csatlakozás

A kapcsolat létrehozása egyszerűen a XMPPTCPConnection osztály:

AbstractXMPPConnection connection = new XMPPTCPConnection (config); connection.connect (); // Kapcsolatot létesít a szerverrel connection.login (); // Bejelentkezés 

Az osztály tartalmaz egy konstruktort, amely elfogadja a korábban felépített konfigurációt. Emellett módszereket kínál a kiszolgálóhoz való csatlakozáshoz és a bejelentkezéshez.

A kapcsolat létrejötte után használhatjuk a Smack szolgáltatásait, mint csevegés, amelyet a következő szakaszban írunk le.

Abban az esetben, ha a kapcsolat hirtelen megszakad, alapértelmezés szerint a Smack megpróbálja újracsatlakozni.

A ReconnectionManager megpróbálja azonnal újracsatlakozni a szerverhez, és növeli a próbálkozások közötti késleltetést, mivel az egymást követő újracsatlakozások folyamatosan kudarcot vallanak.

5. Csevegés

A könyvtár egyik fő jellemzője - a chat támogatás.

Használni a Csevegés osztály lehetővé teszi új üzenetek létrehozását két felhasználó között:

ChatManager chatManager = ChatManager.getInstanceFor (kapcsolat); EntityBareJid jid = JidCreate.entityBareFrom ("[e-mail védett]"); Chat chat = chatManager.chatWith (jid);

Vegye figyelembe, hogy a Csevegés használtuk a ChatManager és nyilvánvalóan meghatározta, kivel beszélgethet. Ez utóbbit a EntityBareJid tárgy, amelybecsomagol egy XMPP-címet - felvesz egy JID-t - helyi részből áll (baeldung2) és egy tartományrész (jabb3r.org).

Ezt követően üzenetet küldhetünk a Küld() módszer:

chat.send ("Hello!");

És fogadjon üzeneteket a hallgató beállításával:

chatManager.addIncomingListener (new IncomingChatMessageListener () {@Orride public void newIncomingMessage (EntityBareJid from, Message message, Chat chat) {System.out.println ("Új üzenet" + -tól + -tól ":" + message.getBody ()); }});

5.1. Szobák

A végpontok közötti felhasználói csevegés mellett A Smack a szobák használatával támogatást nyújt a csoportos csevegésekhez.

Kétféle szoba létezik, azonnali szobák és a lefoglalt szobák.

Az azonnali szobák azonnali hozzáférésre állnak rendelkezésre, és automatikusan létrejönnek valamilyen alapértelmezett konfiguráció alapján. Másrészt a lefoglalt szobákat a szobatulajdonos manuálisan konfigurálja, mielőtt bárki beléphet.

Vizsgáljuk meg, hogyan lehet azonnali szobát létrehozni MultiUserChatManager:

MultiUserChatManager manager = MultiUserChatManager.getInstanceFor (kapcsolat); MultiUserChat muc = manager.getMultiUserChat (jid); Resourcepart room = Resourcepart.from ("baeldung_room"); muc.create (szoba) .makeInstant ();

Hasonló módon létrehozhatunk lefoglalt szobát:

Set tulajdonosok = JidUtil.jidSetFrom (új karakterlánc [] {"[email protected]", "[email protected]"}); muc.create (szoba) .getConfigFormManger () .setRoomOwners (tulajdonosok) .submitConfigurationForm ();

6. Névsor

A Smack egy másik szolgáltatása a többi felhasználó jelenlétének nyomon követésének lehetősége.

Val vel Roster.getInstanceFor (), megszerezhetjük a Névsor példa:

Roster roster = Roster.getInstanceFor (kapcsolat);

A Névsor egy névjegyzék, amely a felhasználókat mint RosterEntry objektumokat, és lehetővé teszi számunkra a felhasználók csoportokba rendezését.

Az összes bejegyzést kinyomtathatjuk a Névsor használni a getEntries () módszer:

Gyűjteménybejegyzések = roster.getEntries (); a (RosterEntry bejegyzés: bejegyzések) {System.out.println (bejegyzés); }

Ezenkívül lehetővé teszi számunkra, hogy a bejegyzésben és a jelenléti adatokban bekövetkező változásokat meghallgassuk a RosterListener:

roster.addRosterListener (új RosterListener () {public void bejegyzésekAdded (Gyűjtemény címei) {// új bejegyzések kezelése} public void bejegyzésekDeled (Gyűjtemény címek) {// törölt bejegyzések kezelése} Nyilvános érvénytelen bejegyzésekUpdated (Gyűjtemény címek) {// frissített bejegyzések kezelése } public void jelenléteChanged (Jelenlét jelenléte) {// kezelni a jelenlét módosítását}});

Lehetőséget nyújt a felhasználók magánéletének védelmére is, biztosítva, hogy csak jóváhagyott felhasználók tudnak feliratkozni a névjegyzékre. Ehhez a Smack egy engedélyeken alapuló modellt valósít meg.

A jelenléti előfizetési kérelmeket háromféleképpen lehet kezelni a Roster.setSubscriptionMode () módszer:

  • Roster.SubscriptionMode.accept_all - Fogadjon el minden előfizetési kérelmet
  • Roster.SubscriptionMode.reject_all - Minden előfizetési kérelmet elutasít
  • Roster.SubscriptionMode.manual - A jelenléti előfizetési kérelmek manuális feldolgozása

Ha úgy döntünk, hogy manuálisan kezeljük az előfizetési kérelmeket, regisztrálnunk kell a StanzaListener (írja le a következő szakaszban), és kezelje a csomagokat a Jelenlét.Típus.feliratkozás típus.

7. Stanza

A csevegés mellett a Smack rugalmas keretet biztosít strófák küldésére és a bejövő hallgatására.

Tisztázandó, hogy a szakasz egy diszkrét jelentéstani egység az XMPP-ben. Ez egy strukturált információ, amelyet az egyik entitás a másiknak küld el egy XML adatfolyamon keresztül.

Át tudjuk adni a Stanza keresztül a Kapcsolat használni a Küld() módszer:

Stanza jelenlét = új jelenlét (Presence.Type.subscribe); connection.sendStanza (jelenlét);

A fenti példában a Jelenlét versszak, hogy feliratkozhasson a névjegyzékre.

Másrészt a beérkező szakaszok feldolgozásához a könyvtár két konstrukciót nyújt:

  • StanzaCollector
  • StanzaListener

Különösen, StanzaCollector várjunk szinkronban az új versszakokra:

StanzaCollector gyűjtő = connection.createStanzaCollector (StanzaTypeFilter.MESSAGE); Stanza stanza = gyűjtő.következőEredmény ();

Míg StanzaListener egy felület, amely aszinkron módon értesít minket a beérkező versszakokról:

connection.addAsyncStanzaListener (új StanzaListener () {public void processStanza (Stanza stanza) dobja a SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {// hand stanza}}, StanzaTypeFil

7.1. Szűrők

Ráadásul, a könyvtár beépített szűrőkészletet biztosít a bejövő szakaszok feldolgozásához.

A strófát típus szerint szűrhetjük a használatával StanzaTypeFilter vagy személyi igazolvánnyal StanzaIdFilter:

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

Vagy külön cím alapján megkülönböztetve:

StanzaFilter fromFilter = FromMatchesFilter.create (JidCreate.from ("[e-mail védett]")); StanzaFilter toFilter = ToMatchesFilter.create (JidCreate.from ("[e-mail védett]"));

És használhatjuk a logikai szűrő operátort (AndFilter, OrFilter, NotFilter) komplex szűrők létrehozásához:

StanzaFilter szűrő = új AndFilter (StanzaTypeFilter.Message, FromMatchesFilter.create ("[e-mail védett]"));

8. Következtetés

Ebben a cikkben a leghasznosabb osztályokat ismertettük, amelyeket a Smack a polcról nyújt.

Megtanultuk, hogyan kell konfigurálni a könyvtárat az XMPP strófák küldéséhez és fogadásához.

Ezt követően megtanultuk, hogyan kell kezelni a csoportos csevegéseket ChatManager és Névsor jellemzők.

Szokás szerint az ebben az oktatóanyagban bemutatott összes kódminta elérhető a GitHubon.