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?