Gids voor XMPP Smack Client

1. Inleiding

XMPP is een rijk en complex instant messaging-protocol.

In plaats van onze eigen klant helemaal opnieuw te schrijven, in deze tutorial kijken we naar Smack, een modulaire en draagbare open source XMPP-client geschreven in Java dat heeft veel van het zware werk voor ons gedaan.

2. Afhankelijkheden

Smack is georganiseerd als verschillende modules om meer flexibiliteit te bieden, zodat we gemakkelijk de functies kunnen toevoegen die we nodig hebben.

Enkele hiervan zijn:

  • XMPP via TCP-module
  • Een module die veel van de extensies ondersteunt die zijn gedefinieerd door de XMPP Standards Foundation
  • Ondersteuning voor oudere extensies
  • Een module om te debuggen

We kunnen alle ondersteunde modules vinden in de documentatie van XMPP.

In deze zelfstudie maken we echter alleen gebruik van de tcp, im, extensies, en java7 modules:

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

De nieuwste versies zijn te vinden op Maven Central.

3. Installatie

Om de client te testen, hebben we een XMPP-server nodig. Om dit te doen, maken we een account aan op jabber.hot-chilli.net, een gratis Jabber / XMPP-service voor iedereen.

Daarna kunnen we Smack configureren met de XMPPTCPConnectionConfiguration klasse die een builder biedt om de parameters van de verbinding in te stellen:

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

Met de builder kunnen we de basisinformatie instellen die nodig is om een ​​verbinding tot stand te brengen. Indien nodig kunnen we ook andere parameters instellen, zoals poort, SSL-protocollen en time-outs.

4. Verbinding

Het maken van een verbinding wordt eenvoudig tot stand gebracht met behulp van de XMPPTCPConnection klasse:

AbstractXMPPConnection-verbinding = nieuwe XMPPTCPConnection (config); connection.connect (); // Brengt een verbinding tot stand met de server connection.login (); // Log in 

De klasse bevat een constructor die de eerder gebouwde configuratie accepteert. Het biedt ook methoden om verbinding te maken met de server en in te loggen.

Zodra een verbinding tot stand is gebracht, kunnen we de functies van Smack gebruiken, Leuk vinden chatten, die we in de volgende sectie zullen beschrijven.

In het geval dat de verbinding plotseling werd verbroken, zal Smack standaard proberen opnieuw verbinding te maken.

De ReconnectionManager zal proberen om onmiddellijk opnieuw verbinding te maken met de server en de vertraging tussen pogingen te vergroten, aangezien opeenvolgende herverbindingen blijven mislukken.

5. Chat

Een van de belangrijkste kenmerken van de bibliotheek is chatondersteuning.

De ... gebruiken Chat class maakt het mogelijk om een ​​nieuwe reeks berichten tussen twee gebruikers te maken:

ChatManager chatManager = ChatManager.getInstanceFor (verbinding); EntityBareJid jid = JidCreate.entityBareFrom ("[e-mail beveiligd]"); Chat chat = chatManager.chatWith (jid);

Merk op dat om een Chat we gebruikten een ChatManager en natuurlijk gespecificeerd met wie je wilt chatten. We hebben dit laatste bereikt door de EntityBareJid object, datverpakt een XMPP-adres —aka een JID— samengesteld uit een lokaal deel (baeldung2) en een domeingedeelte (jabb3r.org).

Daarna kunnen we een bericht sturen met de sturen() methode:

chat.send ("Hallo!");

En ontvang berichten door een luisteraar in te stellen:

chatManager.addIncomingListener (nieuwe IncomingChatMessageListener () {@Override public void newIncomingMessage (EntityBareJid van, Berichtbericht, Chat-chat) {System.out.println ("Nieuw bericht van" + van + ":" + message.getBody ()); }});

5.1. Kamers

Naast end-to-end gebruikerschat, Smack biedt ondersteuning bij groepschats door het gebruik van kamers.

Er zijn twee soorten kamers: instant kamers en gereserveerde kamers.

Directe kamers zijn beschikbaar voor directe toegang en worden automatisch gemaakt op basis van een standaardconfiguratie. Aan de andere kant worden gereserveerde kamers handmatig geconfigureerd door de kamereigenaar voordat iemand naar binnen mag.

Laten we eens kijken hoe u een instant-kamer kunt maken met MultiUserChatManager:

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

Op een vergelijkbare manier kunnen we een gereserveerde kamer creëren:

Set eigenaren = JidUtil.jidSetFrom (nieuwe String [] {"[e-mail beschermd]", "[e-mail beschermd]"}); muc.create (room) .getConfigFormManger () .setRoomOwners (eigenaren) .submitConfigurationForm ();

6. Rooster

Een andere functie die Smack biedt, is de mogelijkheid om de aanwezigheid van andere gebruikers te volgen.

Met Roster.getInstanceFor (), we kunnen een Rooster voorbeeld:

Roosterrooster = Roster.getInstanceFor (verbinding);

De Rooster is een contactenlijst die de gebruikers vertegenwoordigt als RosterEntry objecten en stelt ons in staat om gebruikers in groepen te organiseren.

We kunnen alle vermeldingen in het Rooster de ... gebruiken getEntries () methode:

Collectie-items = roster.getEntries (); voor (RosterEntry entry: entries) {System.out.println (entry); }

Bovendien stelt het ons in staat om te luisteren naar wijzigingen in de invoer- en aanwezigheidsgegevens met een Luisteraar:

roster.addRosterListener (nieuwe RosterListener () {openbare ongeldige vermeldingenAdded (verzamelingsadressen) {// nieuwe vermeldingen afhandelen} openbare ongeldige vermeldingenVerwijderd (verzamelingsadressen) {// verwijderde vermeldingen verwerken} openbare ongeldige vermeldingen Bijgewerkt (verzamelingsadressen) {// bijgewerkte vermeldingen verwerken } public void presenceChanged (Presence presence) {// omgaan met verandering van aanwezigheid}});

Het biedt ook een manier om de privacy van gebruikers te beschermen door ervoor te zorgen dat alleen goedgekeurde gebruikers zich kunnen abonneren op een rooster. Om dit te doen, implementeert Smack een op machtigingen gebaseerd model.

Er zijn drie manieren om aanvragen voor aanwezigheidsabonnementen af ​​te handelen met de Roster.setSubscriptionMode () methode:

  • Roster.SubscriptionMode.accept_all - Accepteer alle abonnementsverzoeken
  • Roster.SubscriptionMode.reject_all - Weiger alle abonnementsaanvragen
  • Roster.SubscriptionMode.manual - Verwerk aanvragen voor aanwezigheidsabonnementen handmatig

Als we ervoor kiezen om abonnementsverzoeken handmatig af te handelen, moeten we een StanzaListener (beschreven in de volgende sectie) en behandel pakketten met de Presence.Type.subscribe type.

7. Stanza

Naast de chat biedt Smack een flexibel kader om een ​​stanza te verzenden en te luisteren naar een inkomende stanza.

Ter verduidelijking: een strofe is een discrete semantische betekeniseenheid in XMPP. Het is gestructureerde informatie die van de ene entiteit naar de andere wordt verzonden via een XML-stroom.

We kunnen een Stanza via een Verbinding de ... gebruiken sturen() methode:

Stanza-aanwezigheid = nieuwe aanwezigheid (Presence.Type.subscribe); connection.sendStanza (aanwezigheid);

In het bovenstaande voorbeeld hebben we een Aanwezigheid stanza om je te abonneren op een rooster.

Aan de andere kant biedt de bibliotheek twee constructies om de binnenkomende strofen te verwerken:

  • StanzaCollector
  • StanzaListener

Vooral, StanzaCollector laten we synchroon wachten op nieuwe strofen:

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

Terwijl StanzaListener is een interface voor het asynchroon melden van inkomende strofen:

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

7.1. Filters

Bovendien, de bibliotheek biedt een ingebouwde set filters om inkomende strofen te verwerken.

We kunnen stanza filteren op type met StanzaTypeFilter of op ID met StanzaIdFilter:

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

Of, onderscheidend op een bepaald adres:

StanzaFilter fromFilter = FromMatchesFilter.create (JidCreate.from ("[email protected]")); StanzaFilter toFilter = ToMatchesFilter.create (JidCreate.from ("[email protected]"));

En we kunnen de logische filteroperator gebruiken (AndFilter, OrFilter, NotFilter) om complexe filters te maken:

StanzaFilter filter = nieuw AndFilter (StanzaTypeFilter.Message, FromMatchesFilter.create ("[email protected]"));

8. Conclusie

In dit artikel hebben we de handigste lessen besproken die Smack standaard aanbiedt.

We hebben geleerd hoe we de bibliotheek moeten configureren om XMPP-strofen te verzenden en te ontvangen.

Vervolgens leerden we hoe we groepschats moesten afhandelen met ChatManager en Rooster Kenmerken.

Zoals gewoonlijk zijn alle codevoorbeelden die in deze tutorial worden getoond, beschikbaar op GitHub.


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