Hlavní navigace

Jabber - komunikačný protokol 3

Peter Sivák

V tretej časti seriálu sa vrátime k programovaniu pomocou knižnice Smack. Preberieme si SSL pripojenie k XMPP serveru, blokujúce a neblokujúce získavanie správ a použijeme filter na odfiltrovanie nepotrebných správ.

Po krátkom zastavení sa pri protokole XMPP v druhej časti sa dnes vrátime k Smacku a programovaniu v Jave. Pri každom novom API je užitočné mať po ruke dokumentáciu vo forme javadoc-u. Tu je javadoc pre Smack.

Keďže zastávam názor, že programovanie sa najlepšie učí na príkladoch, rozhodol som sa, že ponúknem jednoduchý príklad, ktorý si následne popíšeme.

Dnešný príklad

Nasledujúci program sa po spustení prihlási na jabber server, počká na prvú správu a pošle ju späť s rovnakým obsahom.

XMPPConnection con =
  new XMPPConnection("jabber.cz");
con.login("meno", "heslo", "smack");

PacketFilter filter =
  new AndFilter(new PacketTypeFilter(Message.class),
  new FromContainsFilter("psivak@jabber.sk"));
PacketCollector myCollector =
  con.createPacketCollector(filter);
// blokujúce čakanie na príchod správy
Message msg = (Message)myCollector.nextResult();

msg.setTo(msg.getFrom());
// odoslanie správy
con.sendPacket(msg);
System.out.println(msg.getBody());
// ukončenie spojenia s XMPP serverom
con.close(); 

Ako to funguje?

Program začína vytvorením objektu z triedy XMPPConnection. XMPPConnection je základná trieda, ktorú Smack obsahuje. Jej konštruktor sa pokúsi pripojiť na XMPP server uvedený v prvom parametri. Druhým parametrom konštruktora je číslo portu, na ktorý sa má pripojiť. Ak sa neuvedie, použije sa 5222.

Je možné pripojiť sa aj cez SSL. Umožňuje nám to trieda SSLXMPPConnection, ktorá je odvodená z XMPPConnection. Stačí teda napísať:

XMPPConnection con =
  new SSLXMPPConnection("jabber.cz"); 

Ak sa spojenie nepodarí vytvoriť, tak konštruktor vyvolá výnimku XMPPException. (treba to ošetriť – napr. spôsobom, ktorý bol uvedený v prvej časti).

V druhom riadku sa program prihlási na existujúce konto meno@jabber.cz/smack a oznámi serveru, že je dostupný. Server upozorní všetky entity (používateľov a aplikácie) uvedené v rosteri, že sa entita meno@jabber.cz/smack stala dostupnou. Metóda login použije najbezpečnejší spôsob autentizácie používateľa, ktorý server podporuje (aspoň to tak píšu v dokumentácii). Tretí parameter je nepovinný a obsahuje názov zdroja.

V minulej časti sme hovorili o troch možnostiach prenosu informácii v protokole XMPP, a to pomocou elementov <message/>, <presence/> a<iq/>. Všeobecne sa im hovorí pakety. V Smacku sú pre ne vytvorené triedy Packet, Message, Presence a IQ.


Obr.1: Packet a odvodené triedy

Program ďalej čaká na paket, ktorý je typu Message a je od konkrétneho používateľa. Prípadné ostatné pakety nás nezaujímajú. To sa dá dosiahnuť pomocou triedy PacketCollector, ktorej inštanciu získame metódou createPacketCo­llector() objektu triedy XMPPConnection.

Trieda PacketFilter slúži na odfiltrovanie paketov. Filter je vytvorený spojením PacketTypeFiltera a FromContainsFil­tera. Prvý zaručí spracovanie paketov typu Message a druhým prejde len paket so zadaným JID. Spojenie filtrov umožňuje AndFilter. Ako hovorí jeho názov, filtrom prejde len paket, ktorý prejde súčasne obidvoma filtrami, z ktorých je zložený.

Trieda PacketCollector umožňuje dva spôsoby prijatia správy – blokujúci a neblokujúci. Blokujúci spôsobí čakanie do príchodu paketu, ktorý prešiel filtrom. Neblokujúci sa len pozrie, či je v rade príchodzích paketov nejaký. Ak áno, tak ho vráti. Ak nie, tak program pokračuje ďalej. To je použiteľné napr. pri vytváraní webového chatu. Blokujúci spôsob umožňuje metóda nextResult(), prípadne metóda nextResult(long timeout). Prvá bude čakať až do príchodu prvého paketu a druhá najviac timeout milisekúnd. Neblokujúce získanie paketu vytvoríte pomocou pollResult().

Ďalší riadok zmení JID príjemcu na JID odosielateľa (snažíme sa poslať správu späť, odkiaľ prišla). Pomocou metódy sendPacket() triedy XMPPConnection pošleme správu späť. Metóda close() ukončí spojenie s XMPP serverom.

Príklad prijatej…:

<message to="testsmack@jabber.sk">
  <body>ahoj</body>
</message>
</pre> 

… a odoslanej správy:

<message from="testsmack@jabber.sk/smack"
to="psivak@jabber.sk/Psi">
  <body>ahoj</body>
</message>
</pre> 

Niekoľko odkazov na inšpiráciu

  1. Zaujímavý článok na serveri IBM o využití XMPP na zhromažďovanie debugovacích informácii o distribuovaných aplikáciách. Vyšiel minulý rok.
  2. Aaron Johnson vo svojom weblogunapísal príklad na jabber webchat. Využil pri tom Smack.
  3. JBother – jabber klient napísaný v jave pomocou Smacku. Zdrojové súbory ukazujú, ako používať Smack.

V nasledujúcej časti si popíšeme prácu s rosterom a naučíme sa vytvárať a rušiť jabber kontá.

Našli jste v článku chybu?
DigiZone.cz: SES zajistí HD pro M7 Group

SES zajistí HD pro M7 Group

DigiZone.cz: V Plzni odstartovalo Radio 1

V Plzni odstartovalo Radio 1

DigiZone.cz: R2B2 a Hybrid uzavřely partnerství

R2B2 a Hybrid uzavřely partnerství

Vitalia.cz: To nejhorší při horečce u dětí: Febrilní křeče

To nejhorší při horečce u dětí: Febrilní křeče

120na80.cz: Boreliózu nelze žádným testem prokázat

Boreliózu nelze žádným testem prokázat

Lupa.cz: Obchod budoucnosti je bez front, košíků i pokladen

Obchod budoucnosti je bez front, košíků i pokladen

Podnikatel.cz: E-Ježíšek si zařádí: nákupy od 2 do 5 tisíc

E-Ježíšek si zařádí: nákupy od 2 do 5 tisíc

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

DigiZone.cz: Ohrozí Freedom TV přechodové sítě?

Ohrozí Freedom TV přechodové sítě?

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Měšec.cz: Exekuční poradna: ptejte se online

Exekuční poradna: ptejte se online

Podnikatel.cz: K EET. Štamgast už peníze na stole nenechá

K EET. Štamgast už peníze na stole nenechá

Vitalia.cz: Test na HIV je zdarma i za pět set

Test na HIV je zdarma i za pět set

Vitalia.cz: Jak vybrat ořechy do cukroví a kde mají levné

Jak vybrat ořechy do cukroví a kde mají levné

Vitalia.cz: Pamlsková vyhláška bude platit jen na základkách

Pamlsková vyhláška bude platit jen na základkách

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

Vitalia.cz: Nejlepší obranou při nachlazení je útok

Nejlepší obranou při nachlazení je útok

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?