Hlavní navigace

Jabber - komunikačný protokol (2)

2. 8. 2004
Doba čtení: 5 minut

Sdílet

Dnes si ukážeme, ako v skutočnosti prebieha komunikácia medzi jabber serverom a klientom. Vysvetlíme si tiež spôsob identifikácie entít a rozdiel medzi základnými typmi správ.

V predošlej časti sme si ukázali jednoduchý príklad na odoslanie správy cez jabber. Využili sme programovacie rozhranie Smack. Teraz sa pozrieme bližšie na vlastnosti protokolu XMPP, ktoré sú nevyhnutné na zvládnutie práce s knižnicou Smack. Uvedieme si tiež príklady komunikácie medzi klientom a serverom.

XMPP je relatívne jednoduchý protokol, ktorý vďaka svojej rozšíriteľnosti poskytuje veľa možností použitia. Okrem instant messsagingu môže slúžiť ako prenosový protokol pre XML-RPC a webové služby (SOAP), pre notifikáciu o nových článkoch (content syndication) alebo tiež pre hry.

Jabber identifikátory

Všetky entity sú v systéme Jabber identifikované pomocou Jabber ID (JID). Entita môže byť používateľ prihlásený pomocou svojho klienta, komponent alebo proces. Entita je aj jabber server a služby, ktoré poskytuje.

JID vyzerá napríklad takto:

meno@jabber.sk/work

Tento JID označuje používateľa „meno“ zo servera jabber.sk. Posledná časť JIDu oddelená lomítkom sa nazýva zdroj (resource). Koncept zdroja umožňuje, aby bol ten istý používateľ prihlásený na viacerých miestach naraz – doma, v práci, prípadne pomocou svojho mobilného zariadenia. Ak v odoslanej správe neuvedieme zdroj, tak bude správa doručená na implicitné zariadenie určené používateľom. Ak je zariadení viac, tak sa rozhoduje podľa priority. Priorita môže byť priradená každému zdroju – je to celé kladné číslo. Entita ju môže meniť počas pripojenia. Čím je väčšie číslo, tým je vyššia priorita. Ak majú zdroje rovnakú prioritu, tak vyhráva ten, ktorý sa prihlásil naposledy.

JID musí obsahovať meno servera (hostname) a môže obsahovať meno používateľa a zdroj. Malá zaujímavosť je, že pokial meno používateľa je case-insensitive, tak názov zdroja je case-sensitive. Používatel root sa môže prihlasovať tiež ako ROOT a pod.

Komunikácia

Protokol XMPP je založený na XML. Komunikácia prebieha cez TCP spojenie. Celá komunikácia, ktorá prebehla medzi dvomi koncovými bodmi, vytvára dva XML dokumenty. Jeden v smere od klienta k serveru a druhý opačne.

Server čaká na porte 5222 na prihlásenie klienta. Po vytvorení TCP spojenia sa klient ohlási zaslaním XML deklarácie a koreňového tagu:

<?xml version="1.0"?>
<stream:stream
  xmlns:stream="http://etherx.jabber.org/streams"
  to="jabber.sk"
  xmlns="jabber:client">

Server odpovie podobne:

<?xml version="1.0"?>
<stream:stream
  xmlns:stream='http://etherx.jabber.org/streams'
  id='1461777714'
  xmlns='jabber:client'
  from='jabber.sk'>

Po vytvorení XML streamu sa klient musí autentizovať, aby mohol využívať služby servera. Jabber umožňuje niekoľko spôsobov odosielania hesla vrátane hashovacej metódy SHA1. Na ukážku je tu odoslanie nezakódovaného hes­la:

<iq type="set" id="auth_2" to="jabber.sk">

  <query xmlns="jabber:iq:auth">
    <username>psivak</username>
    <password>heslo</password>
    <resource>work</resource>

  </query>
</iq>

Odpoveď servera po úspešnej autentizácii:

<iq from="jabber.sk" id='auth_2' type='result'/>

Nasleduje samotné posielanie správ a informácii o dostupnosti používateľa. Na to sú určené tri elementy: <message/>,<pre­sence/> a <iq/>. Tie si popíšeme bližšie. Komunikácia sa končí odoslaním ukončovacieho tagu (v obidvoch smeroch jeden):

</stream:stream>

Element Message

XMPP definuje päť rôznych typov správ. Typ „normal“ je správa, pri ktorej sa neočakáva bezprostredná odpoveď – podobne ako email. Správa typu „chat“ je zvyčajne časťou rozhovoru a predpokladá sa zobrazenie v okne spolu s ostatnými časťami komunikácie. Správa typu „groupchat“ sa používa pri konferenčnom rozhovore. Štvrtým typom je typ „headline“, ktorý nesie názov článku spolu s URL a popisom. Posledným typom je chybová správa.

Správa môže vyzerať napr. takto:

<message to='psivak@jabber.sk' from='xy@jabber.cz/work'>
  <subject>test</subject>
  <body>Hello Jabber!</body>

</message>

Text formátovaný v XHTML môže byť tiež odosielaný v </message>:

<message id="3" to="psivak@jabber.sk" type="chat">
  <html xmlns="http://www.w3.org/1999/xhtml">
    <body>

      Hello Jabber!
    </body>
  </html>
  <body>Použitie HTML</body>
</message>

Element Presence

Element <presence/> sa používa, keď entita oznamuje serveru svoju dostupnosť. Zmenu v dostupnosti entity sa server snaží oznámiť všetkým prihláseným entitám, ktoré sú prihlásené na odber týchto správ. Príklad:

<presence>
  <show>xa</show>
  <status>Som na rybách.</status>

  <priority>5</priority>
</presence>

„xa“ znamená „extended away“. Je to typ dostupnosti najbližší k „unavailable“ (nedostupný). Ďalšie možnosti sú away, chat, dnd a normal. Priorita je číslo, o ktorom sme hovorili vyššie.

IQ element

Posledným používaným elementom je element IQ. IQ znamená info/query. Je to mechanizmus podobný modelu request/response protokolu HTTP, ktorý umožňuje odosielanie informácii, ktoré vyžadujú potvrdenie. Sú štyri stavy, v ktorých môže byť IQ komunikácia – get, set, result a error. IQ element typu get odosiela entita, ktorá chce získať informácie od inej entity. Ak entita informácie odosiela, tak by mala byť nastavená na typ set. V prípade, že get alebo set požiavka bola vykonaná úspešne, vráti sa IQ správa typu „result“. Pri chybe sa vráti IQ typu „error“.

Príklad ukazuje žiadosť klienta o zaslanie obsahu rostera:

CS24_early

<iq id='roster_0' type='get'>
  <query xmlns='jabber:iq:roster'/>
</iq>

… a odpoveď servera:

<iq from="psivak@jabber.sk/Psi" type="result" id="roster_0" >
  <query xmlns="jabber:iq:roster">
    <item subscription="both" jid="testsmack@jabber.sk" />
  </query>
</iq> 

Záver

Dnešná časť poskytla stručný prehľad vlastností protokolu XMPP. V ďalších častiach sa vrátime k programovaniu a vytvoríme jednoduchú webovú službu, ktorá použije XMPP ako komunikačný protokol namiesto protokolu HTTP.

Byl pro vás článek přínosný?