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