Jabber - komunikačný protokol

26. 7. 2004
Doba čtení: 4 minuty

Sdílet

Niet pochýb, že dobrá architektúra softvérového systému je kľúčom k jeho dlhej životnosti. Jednou z možných je architektúra orientovaná na služby. Táto bola znovunájdená po vytvorení štandardov pre webové služby. V súčasnosti najpoužívanejším komunikačným protokolom pre webové služby je http. V budúcnosti by ho mohol nahradiť instant messagingový systém jabber. V nasledujúcom článku sa pozrieme na možnosti, ktoré poskytuje programátorom.

Úvod

Jabber sa čoskoro stane štandardom podobne ako to bolo pri http, ftp a ďalších. Vo februári IETF (The Internet Engineering Task Force) schválila návrh protokolu XMPP (eXtensible Messaging and Presence Protocol) a v súčasnosti sa čaká na jeho vydanie v podobe RFC dokumentu. Označenie XMPP sa odporúča namiesto označenia Jabber-protokol.

Účelom tohoto seriálu je prezentovať Jabber z pohľadu programátora. Nie je mojím cielom popisovať samotný protokol (ak by o to bol záujem, nie som proti :)). Bez neho sa (zatial) zaobídeme, lebo existujú rôzne (aj open source) knižnice funkcii pre konkrétne programovacie jazyky. My si ukážeme zopár príkladov v jave (ostatné jazyky budú vyberané podľa vaších komentátov). V článkoch predpokladám iba schopnosť používať niektorý jabber IM klient a znalosti potrebné na rozbehanie jednoduchého programu v jave – hello world bude stačiť :).

V prvej časti si vytvoríme program, ktorý sa prihlási na jabber server, pošle správu, chvíľu ostane prihlásený a potom sa odhlási. Jeho aktivitu budeme sledovať v niektorom IM klientovi. Najskôr sa však pozrime na architektúru platformy Jabber.

Ako funguje jabber

O použití Jabberu na chatovanie bolo na Rootovi zverejnených niekoľko článkov. Keďže posledný vyšiel už viac ako pred rokom, tak najpr zopakujem základné veci. Jabber sa skladá zo serverov, na ktoré sa prihlasujú klienti.

Klient môže poslať správu inému klientovi. Spolu s cielovou adresou ju odovzdá serveru, na ktorom je prihlásený, a ten sa ju snaží doručiť. Ak je klient prihlásený na rovnakom serveri, tak mu ju server doručí. Ak je na inom serveri, tak ju pošle na ten server. Klient nemusí byť práve prihlásený – v takom prípade správa čaká na serveri.

Ďalšou vlastnosťou je, že si server ukladá informáciu o aktuálnom stave klienta (prihlásený, neprihlásený a i.). Klient sa môže prihlásiť na odber týchto informácii, a reagovať tak na zmeny stavu iného klienta.

Messaging v softvérových projektoch

Zistili sme teda, že Jabber doručuje správy medzi rôznymi entitami pripojenými na sieť. Keďže je to otvorený systém, entity nemusia byť len IM klienti. Môžu to byť aj iné aplikácie (procesy). Možno ho tak zaradiť medzi IPC (Inter Process Communication) techniky (ako napr. sokety, rúry a i.). Na rozdiel od spomínaných techník je tu priama podpora šifrovania – vyjednávanie bezpečnostných protokolov pomocou SASL alebo SSL/TLS a podpora unicode-u.

Rozmýšlate, že svoj nový systém rozdelíte na komponenty a komunikáciu medzi nimi založíte na XML, aby ste ho mohli ľahko rozširovať? Tak prečo nevyužiť jabber? Máte k dispozicii metódy na odosielanie správ – nie nahodná podobnosť s posielaním správ v objektovo orientovanom programovaní; prichádzajúce správy obsluhujete pomocou vami definovaných metód; podpora unicodu vám iste často pomôže; ssl jednoducho nastavíte na serveri a použijete vhodnú knižnicu a tiež sa už o to nemusíte starať. Ak ste zvyknutí používať protokol SOAP, tak nie je problém poslať SOAP-envelope ako správu a parsovať ju rovnakým spôsobom, ako ste to robili doteraz.

Smack: ideme programovať

Smack je Open Source (Apache licencia) XMPP klient pre programátorov v jave. Jediné, čo vyžaduje, je JDK vo verzii aspoň 1.2. Predpokladám, že JDK už máte nainštalovaný, a tak sa môžeme pustiť do sťahovania Smacku. V čase písania článku je aktuálna verzia 1.3.0.

Po rozpakovaní stiahnutého súboru v ňom nájdete dokumentáciu a tri jar-súbory: smack.jar je základom smacku a postačuje na jeho použitie, smackx.jar obsahuje podporu pre rozširujúce protokoly a smackx-debug.jar sa dá použiť pri debugovaní (popíšeme v niektorej z ďalších častí).

Najjednoduchšie je skopírovať všetky tri jar-súbory do adresára $JAVA_HOME/jre/lib/ex­t, kde $JAVA_HOME je adresár, v ktorom máte nainštalovaný JDK, alternatívne môžete do premennej prostredia CLASSPATH pridať názvy jar-súborov spolu s cestami k nim.

Príklad

Nasleduje komentovaný príklad programu, ktorý po prihlásení pošle správu druhému klientovi. Budete potrebovať dve kontá na niektorom jabber serveri. Pre jednoduchosť môžete využiť niektorí z verejných serverov. Nové konto si zaregistrujete pomocou jabber IM klienta.

Prvé konto bude používať program na prihlásenie. V príklade je to testsmack@jabber.sk. Vy samozrejme musíte použiť to, čo ste si zaregistrovali vy. Druhé konto (v programe xy@jabber.sk) slúži na sledovanie správania sa programu z IM klienta (ak používate jabber na chatovanie, tak môžete použiť svoje konto. Dôležité je pridanie kontaktu na prvé konto do rostera (kontakt list) IM klienta, aby sme videli, keď sa stane online.

bitcoin školení listopad 24

Takže – preložte program a v IM klientovi sa prihláste pomocou svojho konta. Spustite program. V IM klientovi uvidíte, že sa program prihlásil a poslal vám správu. Po ubehnutí dvadsiatich sekúnd sa program odhlási.

import org.jivesoftware.smack.*;
// timer kôli oneskoreniu
import java.util.Timer;
import java.util.TimerTask;

public class Testsmack {
  XMPPConnection conn;
  Timer timer;

  public static void main(String[] arg) {
    Testsmack test = new Testsmack(20);
  }

  public Testsmack(int seconds) {
    try {
      // pripojenie k serveru
      conn = new XMPPConnection("jabber.sk");
      // prihlásenie
      conn.login("testsmack", "heslo");
      // naplánovanie odhlásenia o seconds sekúnd
      timer = new Timer();
      timer.schedule(new EndTest(), seconds * 1000);
      System.out.println("Test started");
      // odoslanie správy
      Chat newChat = conn.createChat("xy@jabber.sk");
      newChat.sendMessage("Test started");
    } catch (XMPPException ex) {
      // ukončenie po chybe pri komunikácii
      System.out.println("Error: " + ex.getMessage());
      System.exit(1);
    }
  }

  class EndTest extends TimerTask {
    // run sa vykoná po dvadsiatich sekundách
    public void run() {
      System.out.println("Time's up");
      System.exit(0);
    }
  }
}

To je na dnes všetko. Nabudúce trochu nazrieme pod vrstvu, ktorú nám ponúka smack, a ukážeme si, ako v skutočnosti vyzerajú dáta, ktoré prúdia medzi klientom a serverom.