Vejledning til XMPP Smack Client

1. Introduktion

XMPP er en rig og kompleks instant messaging-protokol.

I stedet for at skrive vores egen klient fra bunden, i denne vejledning ser vi på Smack, en modulær og bærbar open source XMPP-klient skrevet i Java det har gjort meget af det tunge løft for os.

2. Afhængigheder

Smack er organiseret som flere moduler for at give mere fleksibilitet, så vi nemt kan inkludere de funktioner, vi har brug for.

Nogle af disse inkluderer:

  • XMPP over TCP-modul
  • Et modul, der understøtter mange af de udvidelser, der er defineret af XMPP Standards Foundation
  • Understøttelse af ældre udvidelser
  • Et modul til fejlretning

Vi kan finde alle de understøttede moduler i XMPP's dokumentation.

I denne vejledning bruger vi dog bare tcp, Jeg er, udvidelserog java7 moduler:

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

De nyeste versioner findes på Maven Central.

3. Opsætning

For at teste klienten har vi brug for en XMPP-server. For at gøre dette opretter vi en konto på jabber.hot-chilli.net, en gratis Jabber / XMPP-service for alle.

Derefter kan vi konfigurere Smack ved hjælp af XMPPTCPConnectionConfiguration klasse, der giver en bygherre til at opsætte forbindelsens parametre:

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

Byggeren giver os mulighed for at indstille de grundlæggende oplysninger, der er nødvendige for at udføre en forbindelse. Hvis det er nødvendigt, kan vi også indstille andre parametre såsom port, SSL-protokoller og timeouts.

4. Forbindelse

Oprettelse af en forbindelse opnås simpelthen ved hjælp af XMPPTCP Forbindelse klasse:

AbstractXMPPConnection forbindelse = ny XMPPTCPConnection (config); connection.connect (); // Opretter en forbindelse til serverforbindelsen. Login (); // Logger ind 

Klassen indeholder en konstruktør, der accepterer den tidligere konfigurerede konfiguration. Det giver også metoder til at oprette forbindelse til serveren og logge ind.

Når en forbindelse er oprettet, kan vi bruge Smacks funktioner, synes godt om snak, som vi vil beskrive i det næste afsnit.

I tilfælde af at forbindelsen pludselig blev afbrudt, forsøger Smack som standard at oprette forbindelse igen.

Det ReconnectionManager forsøger straks at oprette forbindelse til serveren igen og øge forsinkelsen mellem forsøg, da successive genforbindelser fortsat fejler.

5. Chat

En af de vigtigste funktioner i biblioteket er - chat support.

Bruger Snak klasse gør det muligt at oprette en ny tråd af meddelelser mellem to brugere:

ChatManager chatManager = ChatManager.getInstanceFor (forbindelse); EntityBareJid jid = JidCreate.entityBareFrom ("[email protected]"); Chatchat = chatManager.chatWith (jid);

Bemærk, at at bygge en Snak vi brugte en ChatManager og tydeligvis specificeret, hvem der skal chatte med. Vi opnåede sidstnævnte ved hjælp af EntityBareJid objekt, somindpakker en XMPP-adresse —aka en JID— sammensat af en lokal del (baeldung2) og en domænedel (jabb3r.org).

Derefter kan vi sende en besked ved hjælp af sende() metode:

chat.send ("Hej!");

Og modtag beskeder ved at indstille en lytter:

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

5.1. Værelser

Samt end-to-end brugerchat, Smack yder support til gruppechats gennem brug af værelser.

Der er to typer værelser, øjeblikkelige værelser og reserverede værelser.

Øjeblikkelige værelser er tilgængelige for øjeblikkelig adgang og oprettes automatisk baseret på en vis standardkonfiguration. På den anden side konfigureres reserverede værelser manuelt af rummets ejer, før nogen får adgang.

Lad os se på, hvordan du opretter et øjeblikkeligt rum ved hjælp af MultiUserChatManager:

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

På lignende måde kan vi oprette et reserveret rum:

Sæt ejere = JidUtil.jidSetFrom (ny streng [] {"[e-mailbeskyttet]", "[e-mailbeskyttet]"}); muc.create (rum) .getConfigFormManger () .setRoomOwners (ejere) .submitConfigurationForm ();

6. Roster

En anden funktion, som Smack giver, er muligheden for at spore tilstedeværelsen af ​​andre brugere.

Med Roster.getInstanceFor (), vi kan få en Roster eksempel:

Rosterroster = Roster.getInstanceFor (forbindelse);

Det Roster er en kontaktliste, der repræsenterer brugerne som RosterEntry objekter og giver os mulighed for at organisere brugere i grupper.

Vi kan udskrive alle poster i Roster bruger getEntries () metode:

Samlingsposter = roster.getEntries (); for (RosterEntry-post: poster) {System.out.println (post); }

Desuden giver det os mulighed for at lytte efter ændringer i dets poster og tilstedeværelsesdata med en RosterListener:

roster.addRosterListener (ny RosterListener () {offentlige ugyldige posterTilføjet (Samlingsadresser) {// håndter nye poster} offentlige ugyldige poster Slettet (Samlingsadresser) {// håndter slettede poster} offentlige ugyldige posterOpdateret (Samlingsadresser) {// håndter opdaterede poster } offentlig tomrum tilstedeværelseChanged (Tilstedeværelse tilstedeværelse) {// håndter tilstedeværelsesændring}});

Det giver også en måde at beskytte brugerens privatliv ved at sikre, at kun godkendte brugere er i stand til at abonnere på en liste. For at gøre dette implementerer Smack en tilladelsesbaseret model.

Der er tre måder at håndtere anmodninger om tilstedeværelsesabonnement med Roster.setSubscriptionMode () metode:

  • Roster.SubscriptionMode.accept_all - Accepter alle abonnementsanmodninger
  • Roster.SubscriptionMode.reject_all - Afvis alle abonnementsanmodninger
  • Roster.SubscriptionMode.manual - Behandl anmodninger om tilstedeværelsesabonnement manuelt

Hvis vi vælger at håndtere abonnementsanmodninger manuelt, skal vi registrere en StrofeLytter (beskrevet i næste afsnit) og håndter pakker med Presence.Type.abonnement type.

7. strofe

Ud over chatten giver Smack en fleksibel ramme til at sende en strofe og lytte efter indgående.

For at præcisere, er en strofe en diskret semantisk meningsenhed i XMPP. Det er strukturerede oplysninger, der sendes fra en enhed til en anden over en XML-stream.

Vi kan sende en Strofe gennem en Forbindelse bruger sende() metode:

Stanza-tilstedeværelse = ny tilstedeværelse (Presence.Type.subscribe); connection.sendStanza (tilstedeværelse);

I eksemplet ovenfor sendte vi en Tilstedeværelse strofe for at abonnere på en liste.

På den anden side leverer biblioteket to konstruktioner til at behandle de indkommende strofer:

  • StanzaCollector
  • StrofeLytter

I særdeleshed, StanzaCollector lad os vente synkront på nye strofer:

StanzaCollector collector = connection.createStanzaCollector (StanzaTypeFilter.MESSAGE); Strofe strofe = collector.nextResult ();

Mens StrofeLytter er en grænseflade til asynkront at underrette os om indgående strofer:

connection.addAsyncStanzaListener (ny StanzaListener () {offentlig ugyldig procesStanza (Stanza stanza) kaster SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {// handle stanza}}, StanzaTypeFilter.MAGE;

7.1. Filtre

I øvrigt, biblioteket leverer et indbygget sæt filtre til at behandle indkommende strofer.

Vi kan filtrere strofe efter type ved hjælp af StanzaTypeFilter eller ved ID med StanzaIdFilter:

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

Eller skelne efter bestemt adresse:

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

Og vi kan bruge logisk filteroperator (Og filter, OrFilter, Ikke filter) for at oprette komplekse filtre:

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

8. Konklusion

I denne artikel dækkede vi de mest nyttige klasser, som Smack giver fra hylden.

Vi lærte at konfigurere biblioteket for at sende og modtage XMPP-strofe.

Derefter lærte vi at håndtere gruppechats ved hjælp af ChatManager og Roster funktioner.

Som normalt er alle kodeeksempler vist i denne vejledning tilgængelige på GitHub.


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