Veiledning til XMPP Smack Client

1. Introduksjon

XMPP er en rik og kompleks direktemeldingsprotokoll.

I stedet for å skrive vår egen klient fra bunnen av, i denne opplæringen tar vi en titt på Smack, en modulær og bærbar XMPP-klient med åpen kildekode skrevet i Java som har gjort mye av det tunge løftet for oss.

2. Avhengigheter

Smack er organisert som flere moduler for å gi mer fleksibilitet, slik at vi enkelt kan inkludere funksjonene vi trenger.

Noen av disse inkluderer:

  • XMPP over TCP-modul
  • En modul som støtter mange av utvidelsene definert av XMPP Standards Foundation
  • Støtte for eldre utvidelser
  • En modul å feilsøke

Vi finner alle støttede moduler i XMPPs dokumentasjon.

I denne opplæringen vil vi imidlertid bare bruke tcp, jeg er, utvidelser, og java7 moduler:

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

De nyeste versjonene finner du på Maven Central.

3. Oppsett

For å teste klienten trenger vi en XMPP-server. For å gjøre det oppretter vi en konto på jabber.hot-chilli.net, en gratis Jabber / XMPP-tjeneste for alle.

Etterpå kan vi konfigurere Smack ved hjelp av XMPPTCPConnectionConfiguration klasse som gir en byggherre å sette opp tilkoblingens parametere:

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

Byggherren lar oss sette grunnleggende informasjon som er nødvendig for å utføre en forbindelse. Om nødvendig kan vi også angi andre parametere som port, SSL-protokoller og tidsavbrudd.

4. Tilkobling

Å opprette en forbindelse oppnås ganske enkelt ved hjelp av XMPPTCP-tilkobling klasse:

AbstractXMPPConnection connection = new XMPPTCPConnection (config); connection.connect (); // Oppretter en forbindelse til serverforbindelsen.login (); // Logger inn 

Klassen inneholder en konstruktør som godtar konfigurasjonen som ble bygget tidligere. Det gir også metoder for å koble til serveren og logge på.

Når en forbindelse er opprettet, kan vi bruke Smacks funksjoner, som chatte, som vi vil beskrive i neste avsnitt.

I tilfelle forbindelsen plutselig ble avbrutt, vil Smack som standard prøve å koble til igjen.

De ReconnectionManager vil prøve å umiddelbart koble til serveren igjen og øke forsinkelsen mellom forsøk, ettersom suksessive omkoblinger fortsetter å mislykkes.

5. Chat

En av de viktigste funksjonene i biblioteket er - chat-støtte.

Bruker Chat klasse gjør det mulig å opprette en ny tråd med meldinger mellom to brukere:

ChatManager chatManager = ChatManager.getInstanceFor (tilkobling); EntityBareJid jid = JidCreate.entityBareFrom ("[email protected]"); Chat chat = chatManager.chatWith (jid);

Merk at for å bygge en Chat vi brukte en ChatManager og tydeligvis spesifisert hvem du skal chatte med. Vi oppnådde sistnevnte ved å bruke EntityBareJid objekt, sombryter inn en XMPP-adresse —aka en JID— sammensatt av en lokal del (baeldung2) og en domenedel (jabb3r.org).

Etter det kan vi sende en melding ved hjelp av sende() metode:

chat.send ("Hei!");

Og motta meldinger ved å stille inn en lytter:

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

5.1. Rom

I tillegg til slutt-til-slutt-brukerprat, Smack gir støtte for gruppechatter gjennom bruk av rom.

Det er to typer rom, øyeblikkelige rom og reserverte rom.

Øyeblikkelige rom er tilgjengelige for umiddelbar tilgang og opprettes automatisk basert på noen standardkonfigurasjoner. På den annen side konfigureres reserverte rom manuelt av romeieren før noen får lov til å komme inn.

La oss ta en titt på hvordan du lager et øyeblikkelig rom ved hjelp av MultiUserChatManager:

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

På samme måte kan vi lage et reservert rom:

Sett eiere = JidUtil.jidSetFrom (ny streng [] {"[e-postbeskyttet]", "[e-postbeskyttet]"}); muc.create (rom) .getConfigFormManger () .setRoomOwners (eiere) .submitConfigurationForm ();

6. Vaktliste

En annen funksjon som Smack gir, er muligheten til å spore tilstedeværelsen til andre brukere.

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

Rosterliste = Roster.getInstanceFor (tilkobling);

De Roster er en kontaktliste som representerer brukerne som RosterEntry objekter og lar oss organisere brukere i grupper.

Vi kan skrive ut alle oppføringene i Roster bruker getEntries () metode:

Samlingsoppføringer = roster.getEntries (); for (RosterEntry entry: entries) {System.out.println (entry); }

Videre lar den oss lytte etter endringer i oppføringene og tilstedeværelsesdataene med en RosterListener:

roster.addRosterListener (ny RosterListener () {offentlige ugyldige oppføringerLagt til (Samlingsadresser) {// håndterer nye oppføringer} offentlige ugyldige oppføringer Slettet (Samlingsadresser) {// håndterer slettede oppføringer} offentlige ugyldige oppføringer Oppdatert (Samlingsadresser) {// håndterer oppdaterte oppføringer } offentlig ugyldig tilstedeværelseChanged (Tilstedeværelse) {// håndter tilstedeværelsesendring}});

Det gir også en måte å beskytte brukerens privatliv ved å sørge for at bare godkjente brukere kan abonnere på en liste. For å gjøre dette implementerer Smack en tillatelsesbasert modell.

Det er tre måter å håndtere forespørsler om tilstedeværelsesabonnement med Roster.setSubscriptionMode () metode:

  • Roster.SubscriptionMode.accept_all - Godta alle abonnementsforespørsler
  • Roster.SubscriptionMode.reject_all - Avvis alle abonnementsforespørsler
  • Roster.SubscriptionMode.manual - Behandle tilstedeværelsesabonnementsforespørsler manuelt

Hvis vi velger å håndtere abonnementsforespørsler manuelt, må vi registrere en StanzaListener (beskrevet i neste avsnitt) og håndter pakker med Presence.Type.abonnement type.

7. Strofe

I tillegg til chatten, gir Smack et fleksibelt rammeverk for å sende en strofe og lytte etter innkommende.

For å avklare er en strofe en diskret semantisk meningsenhet i XMPP. Det er strukturert informasjon som sendes fra en enhet til en annen over en XML-strøm.

Vi kan overføre en Strofe gjennom en Forbindelse bruker sende() metode:

Strofe tilstedeværelse = ny tilstedeværelse (Presence.Type.abonnement); connection.sendStanza (tilstedeværelse);

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

På den annen side tilbyr biblioteket to konstruksjoner for å behandle innkommende strofer:

  • StanzaCollector
  • StanzaListener

Spesielt, StanzaCollector la oss vente synkront på nye strofer:

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

Samtidig som StanzaListener er et grensesnitt for asynkront å varsle oss om innkommende strofer:

connection.addAsyncStanzaListener (ny StanzaListener () {public void processStanza (Stanza strofe) kaster SmackException.NotConnectedException, InterruptedException, SmackException.NotLoggedInException {// handle stanza}}, StanzaTypeFilter.MAGE)

7.1. Filtre

Videre biblioteket tilbyr et innebygd sett med filtre for å behandle innkommende strofer.

Vi kan filtrere strofe etter type ved hjelp av StanzaTypeFilter eller etter ID med StanzaIdFilter:

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

Eller, kresne etter bestemt adresse:

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

Og vi kan bruke logisk filteroperatør (Og filter, OrFilter, Ikke filter) for å lage komplekse filtre:

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

8. Konklusjon

I denne artikkelen dekket vi de mest nyttige klassene som Smack gir fra hyllen.

Vi lærte å konfigurere biblioteket for å sende og motta XMPP-strofe.

Deretter lærte vi hvordan vi skulle håndtere gruppechatter ChatManager og Roster funksjoner.

Som vanlig er alle kodeeksempler vist i denne opplæringen tilgjengelig på GitHub.


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