1. Úvod charakterizující kontext zadání. 2. Popis řešeného problému, vymezení cílů BP a požadavků na implementovaný systém. 3. Popis struktury BP ve vztahu k vytyčeným cílům. 4. Rešeršní zpracování existujících implementací, pokud jsou známy. 5. Analýza a návrh implementace (včetně diskuse různých alternativ a volby implementačního prostředí). 6. Popis implementace / realizace se zaměřením na nestandardní části řešení. 7. Výsledky testování. 8. Srovnání s existujícími řešeními, pokud jsou známy. 9. Závěr (zhodnocení splnění cílů BP, vlastního přínosu, doporučení dalšího pokračování práce.) 10. Seznam použité literatury. 11. Přílohy.
Internetový server lide.cz nabízí uživatelům diskusní službu. V současné době uživatelé komunikují se službou serveru pomocí internetového prohlížeče. Vytvořte klientský program, který bude komunikovat se službou serveru přímo bez potřeby používat internetový prohlížeč. Řešení založte na analýze a interpretaci HTML kódu generovaného serverem. Při řešení musíte zohlednit i skutečnost, že kód generovaný serverem může obsahovat vložený JavaScript. Doporučený jazyk pro implementaci je VisualBasic. Rozsah konzultujte s vedoucím práce.
Tady bude oficiální zadání
2
České vysoké učení technické v Praze Fakulta Elektrotechnická
Bakalářská práce
Klient pro diskusní službu internetového serveru lide.cz Petr Machota
Vedoucí práce: Ing. Michal Voráček
Studijní program: Elektrotechnika a informatika strukturovaný bakalářský Obor: Informatika a výpočetní technika červenec 2006
ii
Poděkování Děkuji vedoucímu práce Ing. Michalu Voráčkovi za dohled a kontrolu tvorby bakalářské práce.
iii
iv
Prohlášení Prohlašuji, že jsem svou bakalářskou práci vypracoval samostatně a použil jsem pouze podklady uvedené v přiloženém seznamu. Nemám závažný důvod proti užití tohoto školního díla ve smyslu §60 Zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon).
V Kralupech nad Vltavou dne 24.7. 2006
v
vi
Abstract Program that enables using discussing service of server Lide without web browser. Client interprets html code generated by server and emulates important JavaScript function.
Abstrakt Program umožňuje používat diskusní službu internetového serveru lide.cz. Klientský program komunikuje přímo se serverem bez potřeby internetového prohlížeče. Řešení je založeno na analýze a interpretaci HTML kódu generovaného serverem. Při interpretaci zohledňuje vložený JavaScript, jehož hlavní funkce emuluje.
vii
viii
Obsah Seznam obrázků................................................................................................................xiii 1. Úvod ................................................................................................................................ 1 2. Popis řešeného úkolu ..................................................................................................... 2 2.1. Autentizace ............................................................................................................. 3 2.2. Správa identity........................................................................................................ 3 2.3. Kategorie místností a druhy místností .................................................................... 4 2.4. Uživatelská hierarchie ............................................................................................ 4 2.5. Okno chatování....................................................................................................... 5 3. Vymezení cíle práce ....................................................................................................... 9 4. Přehled existujících řešení........................................................................................... 10 4.1. IRC brána na webchat lide.cz ............................................................................... 10 5. Návrh struktury ........................................................................................................... 11 5.1. Návrh struktury jádra............................................................................................ 12 5.1.1. Naivní řešení............................................................................................. 12 5.1.2. Paralelní struktura..................................................................................... 13 5.1.3. Paralelní struktura s vlákny ...................................................................... 14 5.1.4. Paralelní struktura se členěnými vlákny................................................... 15 5.2. Struktura programu............................................................................................... 16 5.3. Jazyk pro implementaci ........................................................................................ 16 6. Popis implementace ..................................................................................................... 17 6.1. Použití vláken ....................................................................................................... 17 6.1.1. Způsob paralelního běhu více vláken ....................................................... 17 6.1.2. Sdílení proměnných mezi vlákny ............................................................. 17 6.1.3. Vlákno komunikace se serverem.............................................................. 18 6.1.4. Vlákno zpracování odpovědí .................................................................... 18 6.2. Implementace jednotlivých částí .......................................................................... 18 6.2.1. Časovače................................................................................................... 18 6.2.2. Fronta požadavků ..................................................................................... 19 6.2.3. Komunikace se serverem.......................................................................... 20 6.2.4. Fronta odpovědí........................................................................................ 20 6.2.5. Analýza a zpracování příspěvků............................................................... 21 6.2.6. Analýza a zpracování seznamu lidí .......................................................... 21 6.2.7. Fronta příspěvků ....................................................................................... 21 6.2.8. Seznam lidí ............................................................................................... 22 6.2.9. Transformace příspěvků do zobrazitelné formy....................................... 23 6.3. Hlavní třídy, zobrazení dat ................................................................................... 24 6.3.1. Okno pro výběr místnosti. ........................................................................ 24 6.3.2. Okno pro přihlašování .............................................................................. 24 6.3.3. Okno pro chatování .................................................................................. 24 6.3.4. Přístup k prvkům hlavního formuláře z různých vláken .......................... 25 6.3.5. Modul klienta............................................................................................ 25
ix
7. Testování....................................................................................................................... 26 7.1. Alfa testování – testování jednotlivých modulů................................................... 26 7.2. Beta testování – testování na úrovni modulů ....................................................... 26 7.3. Testování celé aplikace ........................................................................................ 26 8. Srovnání s webovým klientem .................................................................................... 27 8.1. Výhody a nevýhody webového klienta ................................................................ 27 8.2. Výhody a nevýhody Klienta chatu Lidé............................................................... 27 9. Závěr ............................................................................................................................. 28 10. Seznam použitých zdrojů............................................................................................ 29 A. Obrázky webového klienta ......................................................................................... 30 B. Obrázky implementovaného klienta.......................................................................... 32 C. Struktura přiloženého CD .......................................................................................... 34
x
xi
xii
Seznam obrázků Obrázek 2.1: Průběh využití chatové služby pomocí internetového prohlížeče ................... 2 Obrázek 2.2: Schéma přihlašování a správa identity............................................................. 3 Obrázek 2.3. Rozvržení rámců chatovacího okna ................................................................. 6 Obrázek 4.1: Struktura komunikace pomocí IRC brány ..................................................... 10 Obrázek 5.1: Průběh chatování v klientovi ......................................................................... 11 Obrázek 5.2: Naivní struktura programu............................................................................. 12 Obrázek 5.3: Paralelní struktura programu.......................................................................... 13 Obrázek 5.4: Paralelní struktura řešená vlákny ................................................................... 14 Obrázek 5.5: Paralelní struktura se vyčleněnými vlákny .................................................... 15 Obrázek 5.6: Hlavní třídy klienta ........................................................................................ 16 Obrázek A.1: Indikace přihlášeného uživatele .................................................................... 30 Obrázek A.2: Hlavní nabídka záložkového menu ............................................................... 30 Obrázek A.3: Seznam lidí v místnosti................................................................................. 30 Obrázek A.4: Hlavní okno chatu ......................................................................................... 31 Obrázek B.1: Seznam místností........................................................................................... 32 Obrázek B.2: Dialog pro přihlášení uživatele ..................................................................... 32 Obrázek B.3: Hlavní chatovací okno s příspěvky ............................................................... 33 Obrázek C.1: Struktura přiloženého CD.............................................................................. 34
xiii
xiv
KAPITOLA 1. ÚVOD
1
1. Úvod S rostoucím počtem uživatelů internetu, je stále populárnější online konverzace pomocí internetu. Vedle hlasové a video komunikace se stále velké oblibě těší textová komunikace. Textová komunikace může probíhat buď jenom mezi dvěma účastníky nebo může představovat hromadnou diskuzi několika účastníků. O komunikaci dvou účastníků můžeme hovořit tehdy, účastní-li se komunikace právě dva uživatelé a text není přístupný nikomu dalšímu. Způsob, průběh a ukončení komunikace řídí jenom její účastníci, neexistují zde žádná definovaná pravidla vedení rozhovoru ani chování účastníků. Tento způsob komunikace je často využíván v IM1 službách jako je například ICQ2. Hromadná online diskuze (chat) je komunikace mezi více účastníky. Psaný text od jednoho uživatele může vidět více uživatelů. Komunikace většinou probíhá na nějaké předem stanovené téma, které by se při rozhovoru měli snažit účastníci dodržovat.Většinou existuje vedle sebe několik tématicky odlišných diskuzí, které se nazývají místnosti (často také kanály). Většina komunikace probíhá právě uvnitř místností, ale je možné vést omezený rozhovor i mezi místnostmi. Komunikace v rámci chatu je většinou omezena definovanými pravidly, které mají obecnou platnost pro všechny místnosti a jsou často doplňované pravidly platné jen v konkrétních místnostech. O dodržování pravidel a řízení komunikace se starají účastníci, kteří mají větší pravomoce než je obyčejný účastník, většinou jsou označováni jako operátoři, správci místností, administrátoři apod. Hromadná komunikace může probíhat pomocí definovaného protokolu nebo může být implementován jako služba internetových serverů – pak se jedná o internetový chat. Příkladem komunikace přes vlastní protokol je IRC (Internet Relay Chat). Internetové chatové služby nabízejí např. webové servery společnosti Centrum (XChat) nebo servery společnosti Seznam (Lidé). Textové služby používající vlastní protokol mají většinou více různých klientů, kteří nabízejí vedle samotné komunikace i různé doplňkové funkce. Diskusní služby zprostředkovávané webovými servery většinou využívají ke komunikaci protokol http a jediný možný klient je internetový prohlížeč. Funkce poskytované internetovými klienty jsou však limitovány možnostmi prohlížeče. V současné době neexistuje pro chat službu Lidé žádný stand-alone klient3, který dokáže interpretovat diskusní službu podobně jako internetový prohlížeč. Funkční možnosti stand-alone klienta nejsou na rozdíl od webového omezeny prohlížečem. Vývoj takovéhoto klienta probíhá nezávisle na serveru a umožňuje implementovat dodatečné funkce, které server neposkytuje
1
Instant messaging je internetová služba umožňující posílat zprávy přátelům Zkratka ICQ vznikla jako akronym z anglického I seek you 3 Klient existující jako samostatný program 2
KAPITOLA 2. POPIS ŘEŠENÉHO ÚKOLU
2
2. Popis řešeného úkolu Diskusní služba (chat) je jedna ze služeb, které nabízí server Lidé společnosti Seznam. Uživatelé zde mohou textově komunikovat (chatovat) s ostatními. Účastníci chatu se identifikují svými virtuálními identitami(viz kapitola 2.2 Správa identity), ke kterým se při vstupu na server přihlašují.
Načtení hlavní stránky
Přihlášení
Výběr místnosti
Výběr místnosti
Vstup do místnosti
Vstup do místnosti
Přihlášení
Chatování
Odchod z místnosti
Odhlášení
Zavření stránky
Obrázek 2.1: Průběh využití chatové služby pomocí internetového prohlížeče Uživatel má dvě hlavní možnosti při využívání chatové služby serveru Lidé (viz obrázek 2.1). První možnost je přihlášení ihned při vstupu na server. Přihlášený uživatel má přístup i k ostatním službám serveru Lidé, místnosti může vybírat i ze skupiny nadefinované jako Oblíbené. Při vstupu do místnosti již není vyžadováno přihlášení.
KAPITOLA 2. POPIS ŘEŠENÉHO ÚKOLU
3
Druhá možnost je využívat server nepřihlášený. V tomto případě nemá uživatel přístup ke všem službám serveru, ani k seznamu oblíbených místností. Při vstupu do místnosti je po uživateli vyžadováno přihlášení. Po opuštění místnosti zůstává uživatel v obou případech přihlášený a chce-li může dále využívat služeb chatu nebo se může odhlásit.
2.1. Autentizace Pro využívání všech služeb serveru Lidé je nutné se přihlásit k nějakému vytvořenému účtu (viz obrázek 2.2). Účty jsou sdílené všemi službami serveru Lidé, ale i ostatními službami portálu Seznam. Celý portál umožňuje přihlášení uživatele na kterémkoliv ze svých serverů. Je tak možné se přihlásit k jedné službě a pak bez opětovného přihlašování přejít na službu jinou. Úspěšným přihlášením vznikne tzv. session, která je identifikována vygenerovaným řetězcem. Session zaniká odhlášením uživatele nebo ji systém dokáže odhlásit sám po určité době neaktivity uživatele, nebo při porušení bezpečnosti (třeba přihlášením z jiné IP adresy). Novinkou na Seznamu je i tzv. trvalé přihlášení, kdy je session udržována i při vypnutí počítače. Session je na straně serveru vázána na IP klienta. Přihlášení a existence session je uživateli indikováno změnou pravé horní části stránky (viz obrázek A.1). Přihlašování na server Lidé probíhá HTTP příkazem POST1, v případě přihlašování na serveru Seznam je přihlášení zabezpečené použitím SSL2.
přihlášení
uživatel
n. účet
virtuální identita
Internetový chat na serveru Lidé
správa účtů
Obrázek 2.2: Schéma přihlašování a správa identity
2.2. Správa identity Na serveru Lidé si může uživatel ve svém účtu vyplnit charakteristiky týkající se duševních a fyzických aspektů jeho osobnosti. Může si nastavit osobní fotku (portrét) i zástupný obrázek pro snadnou identifikaci. Vyplní-li uživatel alespoň jednu vlastnost, je označován jako uživatel s profilem. Zástupný obrázek je v některých službách zobrazován spolu s přezdívkou, výrazně tak usnadňuje identifikaci. 1
Metoda POST narozdíl od PUT odesílá heslo a uživatelské jméno v příloze – datové části paketu 2 Secure Sockets Layer - protokol/vrstva, která poskytuje zabezpečení komunikace šifrováním a autentifikaci komunikujících stran
KAPITOLA 2. POPIS ŘEŠENÉHO ÚKOLU
4
2.3. Kategorie místností a druhy místností Chat je dělen do několika kategorií, v rámci kterých jsou jednotlivé tématické místnosti. Kategorií je celkem 8 a jsou to tyto:
Místa a místa Pokec a zábava Seznámení a flirt Koníčky a zájmy Sex a vše kolem něj Ostatní Hudba Sport
V každé z kategorií je seznam místností, které tématem odpovídají názvu. Každá místnost patří právě do jedné kategorie. Na chatu jsou místnosti trojího druhu:
Stálé místnosti Dočasné místnosti Moderované místnosti
Stálé místnosti jsou nejčastějšími na chatu. Mohou je zakládat pouze administrátoři. Tyto místnosti mají vždy alespoň jednoho stálého správce (viz uživatelská hierarchie v následující kapitole). Mohou mít definované vlastní stránky, na kterých mohou být např. pravidla komunikace v místnosti, seznam stálých správců apod. Stálé místnost mohou rušit pouze administrátoři, nebo jsou rušeny systémem v případě, kdy počet prochatovaných hodin uživatelů v místnosti klesne pod určitou hranici danou kategorií. Dočasné místnosti mohou zakládat i samy uživatelé, při založení místnosti se zakladatel stává jediným dočasným správcem místnosti. Splní-li dočasná místnost určitý limit prochatovaných hodin za týden, může zakladatel požádat administrátory o ustálení místnosti. Dočasné místnosti mohou rušit administrátoři nebo systém v okamžiku, kdy z ní odejde poslední uživatel. Moderované místnosti jsou speciální místnosti, které zakládají administrátoři při chatování nějakého významného uživatele (herečka, zpěvák apod.). Místnosti jsou řízeny některým z administrátorů. Místnost existuje jen na dobu nezbytně nutnou.
2.4. Uživatelská hierarchie Na chatu Lidé existuje několik uživatelských rolí:
Běžný uživatel Dočasný správce místnosti Stálý správce místnosti Administrátor Big boss
KAPITOLA 2. POPIS ŘEŠENÉHO ÚKOLU
5
Běžný uživatel je nejrozšířenější role, tito uživatelé mohou využívat většiny služeb serveru Lidé. Mohou vstupovat a odcházet z místností, komunikovat s ostatními uživateli. Dočasný správce (DS) je funkce vázaná na konkrétní místnost. Může být předána od jiného dočasného správce, nebo udělována vyššími funkcemi i systémem za určitých podmínek. DS může vyhazovat běžné uživatele z místnosti, ve které má tuto funkci. Může upravovat nastavení dočasných místností a předávat funkci DS jinému uživateli. V jedné místnosti může být nanejvýš jeden DS. Odejde-li uživatel z místnosti, ztrácí tuto funkci pro danou místnost. Stálý správce (SS) je funkce spjatá se stálými místnostmi. Tuto roli má uživatel jen v místnostech, kde byl do této funkce dosazen nebo zvolen. Funkci SS mají právo udělovat administrátoři. Stálá místnost má nejméně jednoho SS. Funkce může být také udělena systémem na základě hlasování stávajících SS v dané místnosti. Odebírat funkci mohou opět administrátoři, uživatel se může funkce vzdát sám nebo mu ji mohou odebrat ostatní SS na základě výsledků hlasování. Vstoupí-li kdykoliv do místnosti uživatel, který je evidován jako SS dané místnosti, má okamžitě k dispozici funkce plynoucí z této role. Mají možnost vyhazovat uživatele se stejnou nebo nižší rolí z místnosti, mohou měnit nastavení stálé místnosti a mohou jednorázově mazat psané texty v místnosti. Administrátor je uživatel, který je zaměstnancem serveru Lidé společnosti Seznam. Dosazení uživatele do role administrátora je interní záležitost společnosti. Jeho pravomoce již nejsou vázány na jednotlivé místnosti, má právo rušit a ustalovat dočasné místnosti (vytvářet stálé místnosti), přiděluje DS, stanovuje SS. Má pravomoce předešlých uživatelských rolí v kterékoliv místnosti. Dále má možnost vyhazovat uživatele z celého serveru Lidé a zakázat přístup na server z určité IP adresy (tzv. ban), může vstupovat i do zamčených nebo zaheslovaných místností. Může zakládat a řídit moderované chaty. Uživatel s rolí Big boss je programátor chatu, nemá na starosti administraci chodu chatu. Sleduje reakce uživatelů a snaží se chat zdokonalovat. Jako tvůrce má největší pravomoce. Také tato role je plně v kompetenci společnosti Seznam.
2.5. Okno chatování Po úspěšném vstupu se nahraje stránka, která je rozdělená do několika rámců (viz obrázek 2.3 a A.4). Hlavní stránka obsahuje zdrojové kódy javaskriptu většiny funkcí, které jsou používány a také je v ní definovaná většina proměnných. Stavový rámec místnosti obsahuje indikátor odpočítávající vteřiny do obnovení rámce s textem. Data stránky je také možné obnovit ručně odkazem Obnovit. Rámec dále obsahuje informace o aktuálním dočasném správci, druh a název místnosti a odkaz na stránky místnosti. Odkaz Historie zpráv umožňuje zobrazit okno s historií psaného textu v místnosti, uchovává se přibližně posledních 1000 příspěvků. Kliknutím na poslední odkaz Odejít z místnosti je možné místnost opustit. Hlavní a největší část stránky je rámec s příspěvky. Text se obnovuje v časových intervalech od 10 s do 40 s v závislosti na uživatelském nastavení a době od napsání posledního příspěvku.
KAPITOLA 2. POPIS ŘEŠENÉHO ÚKOLU
6 Stavový řádek místnosti
Záložkové menu
Rámec s příspěvky
Stavový řádek uživatele Rámec pro psaní příspěvků
Obrázek 2.3. Rozvržení rámců chatovacího okna
Každý uživatel má možnost zvolit si barvu, kterou budou zobrazovány jeho příspěvky ostatním. Existují tyto druhy příspěvků:
Obyčejný příspěvek Systémová zpráva Šepot v místnosti Šepot z/do jiné místnosti
Obyčejný příspěvek je vypsán netučným písmem, pouze přezdívka autora příspěvku je zobrazena tučným písmem. Formát příspěvku je autor: text. Systémové zprávy posílá automaticky server, většinou jde o informace o příchodech a odchodech uživatelů z místnosti. Zobrazování systémových zpráv lze v nastavení zakázat. Zprávy jsou zobrazovány menším fontem šedé barvy, místo přezdívky autora obsahují čas. Pokud uživatel nechce, aby jeho příspěvek viděli všichni v místnosti, může použít tzv. šeptání. Text napsaný jako šepot uvidí jenom autor a uživatel, pro koho je příspěvek určen (adresát). Příspěvky napsané jako šepot jsou zobrazeny celé tučným fontem a mají formát: #autor->adresát: text. Příspěvky napsané šeptem nejsou smazány při použití příkazu DS/SS pro smazání textu v místnosti. Šeptání je také jediný způsob, jak mohou komunikovat uživatelé, kteří jsou v různých místnostech. Chová se stejně jako šeptání uvnitř místnosti, ale v zobrazeném příspěvku za přezdívkou autora nebo adresáta je navíc v závorce uvedená místnost, do/z které uživatel šeptá: #autor(místnost)->adresát(místnost): text. Příspěvky jsou serverem posílány ve formě parametrizovaného volání javaskript funkcí. Posílají se jenom nové příspěvky a komunikace je komprimována metodou gzip1
1
Gzip pracuje na základě Lempel-Ziv algoritmu, komprimaci provádí server, dekomprimaci webový prohlížeč, algoritmy komprese jsou vedeny pod licencí GNU.
KAPITOLA 2. POPIS ŘEŠENÉHO ÚKOLU
7
Stavový rámec zobrazuje aktuální rychlost obnovy příspěvků a čas uplynulý od posledního napsaného příspěvku. Tyto údaje poskytuje server, jsou tedy aktuální pouze v době obnovy rámce. Odkaz Vypsat jen šeptání zamezí výpisu textu určeného pro všechny, na ploše tak zůstane vidět jen šepot. Uživatel, který čte jenom šepot je zároveň indikován ikonkou vedle své přezdívky v seznamu lidé v místnosti (viz dále). Rámec s emotion ikonami (smajlíky) zobrazuje malé obrázky, které může uživatel použít při psaní příspěvku. Každá ikona má svoje identifikační číslo a může mít definován zástupný text. Ve spodní části okna se nachází rámec pro psaní příspěvků. Do prvního pole může uživatel psát text příspěvku, v roletovém menu napravo může vybírat adresáty (pokud vybere konkrétního uživatele, příspěvek bude odeslán jako šepot). Stiskem tlačítka OK příspěvek odešle na server. Zadávací pole disponuje také automatickým doplňováním přezdívek, stačí napsat počáteční písmeno (případně více písmen) a stisknout klávesu TAB, pokud některá přezdívka začíná na napsané písmeno (písmena) doplní se její text, pokud existuje více variant, tak při dalším stisku TAB se doplní další varianta. Pokud text příspěvku začíná znakem „/“, je text chápán jako příkaz. K dispozici jsou příkazy, které umožňují šeptání, zobrazení podrobností o uživatelích, správci mohou vyhazovat uživatele z místnosti apod. Do textu příspěvků lze vkládat i smajlíky, vkládají se kliknutím na obrázek smajlíku v liště, kde jsou zobrazeny. Při klepnutí se nakonec textu vloží řetězec ve tvaru: :ID_smajliku: za takto vložený smajlík se může pokračovat ve psaní zprávy. Mohlo by se zdát, že se tak dají zobrazit všechny smajlíky, ale server přeloží na obrázky jen ty smajlíky, které má uživatel definované (celkem je v rámci chatu k datu psaní této práce cca 12 000 smajlíků) Délka zprávy má omezenou velikost, po dosažení její délky nelze psát další znaky. Příspěvky jsou odesílány metodou POST, samotný text příspěvku je převeden do kódování x-www-form-urlencoded. V pravé části okna je záložkové menu (viz obrázek A.2), které má záložky:
Hlavní nabídka Seznam lidí Nastavení Přátelé Rychlá nápověda
KAPITOLA 2. POPIS ŘEŠENÉHO ÚKOLU
8 Hlavní nabídka obsahuje:
Odkaz uživatelé zobrazí (přepne na záložku) uživatele v místnosti. Nastavení otevře záložku s nastavením chatu. Přátelé zobrazí záložku, na které jsou vypsaní uživatelé definovaní jako přátelé. Ignorace zobrazí nastavení, ve kterém je můžno určit ignoraci několika uživatelů – jejich texty nebudou vidět. Oblíbené místnosti zobrazí seznam místností, které má uživatel definovaný v oblíbených. Poslat vzkaz otevře okno umožňující napsat a odeslat vzkaz. Admini online zobrazí seznam administrátorů přihlášených na chatu. Historie zobrazí historii komunikace. Správce místnosti je přístupný jenom stálým správcům, otevře administraci místnosti (změna barvy pozadí, popisu místnosti apod.) Hlasování o správcích také přístupný jen pro stálé správce, otevře hlasování o nových stálých správcích. Dále jsou odkazy na ostatní služby Lide.cz a Seznamu. Na záložce seznam lidí (viz obrázek A.3) se zobrazuje v horní části seznam uživatelů, kteří uživateli šeptali, vedle nich je symbolem domečku znázorněná místnost, ze které šeptali a křížek, kterým se dají ze seznamu odstranit. Pomocí odkazu Vypsat ostatní místnosti se zobrazí seznam lidí i v jiných místnostech, než ve které je právě uživatel. Následuje seznam lidí, které jsou v místnosti. Vespod jsou vysvětlivky k použitým symbolům. Kliknutím na symbol panáčka otevřeme profil daného uživatele, pokud klikneme na jméno, nastaví se jako adresát pro šepot. Po najetí kurzoru na přezdívku se zobrazí statistické plovoucí okénko. Uživatelé vypsaní šedou barvou jsou delší dobu neaktivní (tj. nenapsali žádný příspěvek). Seznam lidí se obnovuje po cca 3 minutách, nezobrazuje tedy vždy aktuální stav. Jelikož tento seznam využívá i funkce automatického doplnění přezdívek, stává se, že zamýšlená přezdívka není doplněna, protože ještě není v seznamu uvedena. Na záložce nastavení lze nastavovat parametry, které se týkají chatu. Podrobné a kompletní nastavení je dostupné z vlastního profilu. Seznam přátel zobrazuje podmnožinu uživatelů, které má přihlášený uživatel definovány jako přátele. Zeleně zvýrazněné přezdívky a domečky na konci řádku indikují, že je uživatel v některé místnosti. Kliknutím na domeček se vstoupí do místnosti za ním. Na záložce nápověda jsou zobrazené vysvětlivky k uživatelským příkazům, kompletní nápověda je dostupná po kliknuté na stejnojmenný odkaz.
KAPITOLA 3. VYMEZENÍ CÍLE PRÁCE
9
3. Vymezení cíle práce Cílem práce je vytvořit klientský program, který bude komunikovat s diskusní službou serveru. Klient bude přijímat a zobrazovat text v místnosti, bude přijímat a zobrazovat seznam lidí v místnosti. Bude odesílat text na server, aby mohl být zpracován a zařazen do výpisu textů v místnosti. Uživateli nabídne jeho vlastní nadefinované emotion ikony (smajlíky) a umožní jejich použití. Program bude ohleduplný k internetovému serveru a zároveň bude poskytovat rychlou odezvu na uživatelské příkazy.Bude koncipován tak, aby zajišťoval kvalitu služby i při horším internetovém připojení. Program bude schopen poskytnout základní funkce diskusní služby, tj. umožní výběr místnosti, přihlášení uživatelským jménem a heslem, vstup do místnosti a následnou plnohodnotnou komunikaci s ostatními uživateli. Bude respektovat některé parametry předávané serverem, například rychlost obnovy příspěvků a seznamu lidí. Program bude mít formu spustitelného souboru, bude využívat standardní prvky a knihovní funkce poskytované platformou .NET
KAPITOLA 4. PŘEHLED EXISTUJÍCÍCH ŘEŠENÍ
10
4. Přehled existujících řešení 4.1. IRC brána na webchat lide.cz Pro chat Lidé existuje brána, která umožňuje přistupovat na webový chat také pomocí IRC klientů. Pro svůj provoz vyžaduje nainstalované prostředí jazyka Python, ve kterém je implementován. Program je řešen vícevláknově, každé vlákno obsluhuje jednoho IRC klienta a komunikuje se serverem Lide.cz. Program překládá uživatelské příkazy z IRC do tvaru akceptované serverem. Příspěvky stahuje ze serveru ve formě html stránek a parsuje jejich obsah. Další informace spolu se zdrojovým kódem jsou na adrese [8].
IRC klient 1
HTTP Server chatu
IRC brána chatu
IRC klient 2 IRC
IRC klient n
Obrázek 4.1: Struktura komunikace pomocí IRC brány
KAPITOLA 5. NÁVRH STRUKTURY
11
5. Návrh struktury Program je strukturován do dvou funkčních částí:
jádro grafické uživatelské rozhraní (GUI)
Jádro obsahuje všechny potřebné funkce a struktury pro zajištění komunikace se serverem. Zajišťuje většinu důležitých funkcí pro využívání diskusní služby a komunikuje s uživatelským rozhraním aplikace. Grafické uživatelské rozhraní vhodným způsobem zobrazuje data získaná z jádra programu. Obsluhuje uživatelské interakce a poskytuje objekty a funkce zprostředkovávající ovládání programu pomocí klávesnice a myši.
Spuštění programu
Načtení seznamu místností
Výběr místnosti
Vstup do místnosti
Přihlášení
Zavření programu
Odhlášení
Odchod z místnosti
Chatování
Obrázek 5.1: Průběh chatování v klientovi
Při využívání chatové služby pomocí klienta existuje narozdíl od internetového prohlížeče jen jeden scénář použití (viz obrázek 5.1). Po spuštění programu se zobrazí seznam místností. Rozhodne-li se uživatel do nějaké místnosti vstoupit je vyzván k přihlášení. Po přihlášení může komunikovat ve vybrané místnosti. Odchod a odhlášení se děje najednou při ukončení programu. Přihlášení vyžadované až těsně před vstupem do místnosti a automatické odhlášení při zavření okna programu je bezpečnější a jednoduší na implementaci. Na následujících několika stranách budou rozebrány různé architektury jádra programu a jejich výhody/nevýhody a pak popsány hlavní třídy programu.
KAPITOLA 5. NÁVRH STRUKTURY
12
5.1. Návrh struktury jádra 5.1.1. Naivní řešení
Přihlášení
Výběr a vstup do místnosti
Stáhnutí příspěvků
Stáhnutí seznamu lidí
Uživatel napsal text?
Ne
Ano Odeslání příspěvku
Obrázek 5.2: Naivní struktura programu
Program je řešen sekvenčně, po přihlášení, výběru a vstupu do místnosti je program uzavřen do smyčky, ve které se obnovují data ze serveru a odesílají příspěvky na server. „Naivní“ varianta na obrázku 5.2 nerespektuje rozdílnou periodu stahování nových příspěvků a obnovy seznamu lidí. Také příspěvek uživatele se odesílá jen v jeden určitý okamžik. Tento model může existovat za předpokladu ideálního internetového připojení bez časových prodlev. Pokud je požadována dobrá odezva na uživatelské příkazy, musí smyčka probíhat neustále, což představuje velkou zátěž pro systém.
KAPITOLA 5. NÁVRH STRUKTURY
13
5.1.2. Paralelní struktura
Přihlášení
Výběr a vstup do místnosti
Uživatel napsal text?
Aktivace Aktivace
Ne
Časovač stahování příspěvků
Časovač stahování seznamu lidí
Stáhnutí příspěvků
Stáhnutí seznamu lidí
Zobrazení příspěvků
Zobrazení seznamu lidí
Ano Odeslání příspěvku
Obrázek 5.3: Paralelní struktura programu
Po přihlášení, výběru a vstupu do místnosti jsou aktivované časovače, které se starají o stahování příspěvků a seznamu lidí ze serveru. V hlavní smyčce programu je jen odesílání příspěvku. Ve variantě na obrázku 5.3 je z hlavní smyčky odstraněno načítání dat ze serveru, o které se starají dva časovače. Tím se vyřešila rozdílná perioda aktualizace příspěvků a seznamu lidí. Odesílání ale zůstává stále ve hlavní smyčce, kterou tak stále brzdí při odesílání, kdy se musí čekat na odeslání dat na server. Návrh struktury směřuje k paralelizace programu, protože kdyby časovače stahování dat přerušovali hlavní smyčku znamenalo by to opět další prodlevu. Pokud všechny tři části probíhají paralelně, může docházet k paralelnímu přístupu na server a může dojít ke kolizím, či zahlcení.
KAPITOLA 5. NÁVRH STRUKTURY
14 5.1.3. Paralelní struktura s vlákny
Přihlášení
Výběr a vstup do místnosti
Uživatel napsal text?
Aktivace
Aktivace
Ne
Časovač stahování příspěvků
Časovač stahování seznamu lidí
Stáhnutí příspěvků
Stáhnutí seznamu lidí
Zobrazení příspěvků
Zobrazení seznamu lidí
2. vlákno
3. vlákno
Ano
Odeslání příspěvku n. vlákno
1. vlákno
Obrázek 5.4: Paralelní struktura řešená vlákny Po přihlášení, výběru a vstupu do místnosti jsou spuštěny další dvě vlákna, ve kterých běží časovače a starají se o obnovu příspěvků a seznamu lidí. Pro odesílání příspěvků z hlavní smyčky je vždy vytvořeno nové vlákno, které se stará o odeslání. Toto řešení již používá vlákna pro paralelizaci, stahování příspěvků i seznamu lidí probíhá v samostatných vláknech. Taktéž o odeslání příspěvku se stará dynamicky vytvářené vlákno (vlákna). Uživatelská odezva je v tomto případě již dostatečná, hlavní smyčka běžící v prvním vlákně není zbytečně bržděná komunikací se serverem. Zde však nastává problém se zachováním časové souslednosti při odesílání zpráv. Při odeslání více požadavků v jednu chvíli se může stát, že později napsaný příspěvek se dostane na server dříve, než příspěvek napsaný před ním (toto závisí na pořadí obsluhy vláken systémem).V tomto řešení stále přetrvává problém možného paralelního přístupu na server více vlákny najednou.
KAPITOLA 5. NÁVRH STRUKTURY
15
5.1.4. Paralelní struktura se členěnými vlákny
Přihlášení
Aktivace Aktivace Časovač stahování příspěvků
Časovač stahování seznamu lidí
Výběr a vstup do místnosti Fronta požadavků Obsluha GUI, uživatelské funkce a události, zobrazování dat
Odeslání příspěvku
Zpracování požadavků
Vlákno komunikace se serverem
Aktualizace dat Fronta odpovědí
Hlavní vlákno
Zpracování odpovědí
Vlákno na zpracování odpovědí
Obrázek 5.5: Paralelní struktura se vyčleněnými vlákny
Program po přihlášení, výběru a vstupu do místnosti aktivuje časovače, které se starají o obnovu příspěvků a seznamu lidí. O odesílání příspěvků se stará jiné vlákno než ve kterém běží hlavní smyčka. V hlavní smyčce je pouze obsluha uživatelských funkcí. Toto řešení obsahuje 3 vlákna a dvě fronty. Hlavní vlákno se stará o obsluhu událostí vyvolané uživatelem a o zobrazování dat. Napíše-li uživatel příspěvek, je tento příspěvek spolu se žádostí o obnovu výpisu příspěvků zařazen do fronty požadavků. Do fronty požadavků ještě vkládají požadavky časovače, které se starají o obnovu výpisu a seznamu lidí. Vlákno komunikace se serverem se stará o upload a download požadavků na/z serveru. Vlákno odebírá a splňuje požadavky tak dlouho, dokud nějaké ve frontě jsou. Odpovědi na požadavky vkládá do fronty odpovědí. Vlákno na zpracování odpovědí vybírá frontu odpovědí a zpracovává je na zobrazitelná data, která pak pošle hlavnímu vláknu k zobrazení. Obě dvě fronty zde fungují jako vyrovnávací paměť mezi vlákny. Fronta požadavků eliminuje paralelní přistupování na server a rozkládá tak zátěž. Řeší také problémy při horším internetovém spojení (delší odezva) neboť je blokované jen jedno vlákno, na hlavní vlákno toto nemá vliv. Fronta odpovědí eliminuje čekání na zpracování stáhnutých dat. Vlákno komunikace odpověď zařadí do fronty a může vyřizovat další požadavek, komunikace se serverem tak není bržděna zpracováním přijatých dat a je tedy efektivnější.
KAPITOLA 5. NÁVRH STRUKTURY
16
Avšak paralelní zpracování přináší i problémy při přístupu více vláken do sdílených proměnných a struktur. Proti jednovláknové architektuře se zde musí navíc řešit kolize vláken při čteních a zápisech do proměnných a musí se brát v úvahu i fakt, že čas procesoru přidělovaný vláknům se pokaždé může lišit, takže mezivláknová komunikace musí být buď asynchronní, anebo se musí vlákna explicitně synchronizovat. Tato struktura je nejvhodnější z hlediska nízké zátěže serveru a dobré uživatelské odezvě.
5.2. Struktura programu
Třída formuláře
Hlavní okno pro chat
Okno pro přihlášení
Okno pro výpis místností
GUI
Modul klienta pro komunikaci
jádro
Obrázek 5.6: Hlavní třídy klienta Hlavní okno obsahuje vše potřebné pro komunikaci (příspěvky, seznam lidí apod.). Zobrazí se až po úspěšném vstupu do vybrané místnosti. Okno pro přihlášení obsahuje zadávací políčka pro napsání uživatelského jména a hesla, zobrazí se ve chvíli, kdy uživatel chce vstoupit do vybrané místnosti. Okno pro výpis přehledně zobrazuje seznam místností uspořádané do stromové struktury. Zobrazuje i základní informace o vybrané místnosti a obsahuje tlačítka pro vstup do místnosti. Okno je zobrazeno při spuštění aplikace. Modul klienta komunikace je objekt, ze kterého nelze vytvářet instance. V tomto objektu je zapouzdřeno jádro klienta.
5.3. Jazyk pro implementaci Jako doporučený jazyk k implementaci je Visual basic. Je zvolen VisualBasic na platformě .NET, která poskytuje velké množství objektů pro snadnou implementaci funkcí klienta. Taktéž podpora GUI je zde řešena jednoduchým způsobem a velice usnadňuje vytváření aplikací s grafickým rozhraním.
KAPITOLA 6. POPIS IMPLEMENTACE
17
6. Popis implementace Implementace efektivně využívá objekty poskytované platformou .NET a má vyřešené problémy spojené s paralelním zpracováním dat a udržením konzistence dat. Nejprve bude rozebrána problematika vícevláknových aplikací a řešení v klientovi, pak jednotlivé části aplikace a nakonec budou zhruba popsány formuláře aplikace.
6.1. Použití vláken 6.1.1. Způsob paralelního běhu více vláken Aplikace je koncipována jako vícevláknová, může tedy těžit z paralelního vykonávání více vláken programu najednou. Paralelismus je ale jen zdánlivý, v jeden okamžik se vykonává jen jedno vlákno, takže se procesorový čas musí postupně dělit mezi více vláken. Systém však přepíná vlákna tak rychle, že se zpracování chová jako paralelní Aby se eliminovala zátěž systému, snaží se program nevytížená vlákna uspat. Ve stavu spánku nejsou vlákna zařazovány do plánovací fronty a nijak nezatěžují systém. Pokud jsou potřeba funkce běžící v uspaném vlákně, je potřeba vlákno vzbudit. Probuzené vlákno pokračuje v činnosti následující instrukcí, před kterou bylo uspáno. 6.1.2. Sdílení proměnných mezi vlákny O řešení kolizí při přístupech do sdílených proměnných a struktur se starají objekty, které fungují jako zámky kritických sekcí. Kritická sekce je část kódu, ve kterém vlákno pracuje se sdílenou proměnnou. Na začátku této sekce je příkaz, který oznámí systému že dané vlákno vstoupilo do kritické sekce a dokud jí neopustí nesmí žádné jiné vlákno se stejným zámkem vstoupit do kritické sekce. Díky tomuto opatření se k přístupu do sdílených proměnných dostane vždy jen jedno vlákno, ostatní musí čekat až vlákno kritickou zónu opustí a zámek odemkne.
Příklad zámku: Private LockVlaknaKomunikace As New Object … SyncLock LockVlaknaKomunikace ’kriticka sekce … End SyncLock
KAPITOLA 6. POPIS IMPLEMENTACE
18 6.1.3. Vlákno komunikace se serverem
Vlákno je tvořeno instancí objektu Thread pojmenovanou VlaknoKomunikace. Vlákno vykonává proceduru SmyckaKomunikace. Funkce ZbudVlaknoKomunikace probudí vlákno komunikace pokud bylo uspáno. Tuto funkci volá fronta, pokud do ní byl přidán požadavek, aby mohl být vláknem obsloužen. Funkce UkonciVlaknoKomunikace je volána při ukončení aplikace, nastavuje příznaky, podle kterých vlákno pozná, že má skončit . Procedura SmyckaKomunikace je tvořena jedním nekonečným cyklem neustále se provádějícím pokud je vlákno aktivní. Při jednom průchodu cyklem zkontroluje, jestli ve frontě nejsou nějaké požadavky, pokud ano, všechny je zpracuje a odpovědi naskládá do fronty odpovědí. Zpracování požadavků přeruší jenom žádost o ukončení vlákna, jinak zpracuje postupně celou frontu. Po zpracování fronty opět zkontroluje požadavek na ukončení vlákna a pokud není aktivní, vlákno se uspí. Po probuzení vlákna jde celý cyklus znovu od začátku. Procedura na základě struktury požadavků volá funkce DownloadUrlData nebo UploadUrlData a na základě struktury požadavku a stažených datech naplní datovou strukturu sOdpoved a vloží jí do fronty odpovědí. 6.1.4. Vlákno zpracování odpovědí Strukturu má stejnou jako smyčka komunikace, také má definované funkce UkonciVlaknoParsovani, ZbudVlaknoParsovani a proceduru, kterou vlákno vykonává – SmyckaParsovani.
V proceduře SmyckaParsovani vlákno odebírá položky z fronty odpovědí, a na základě druhu dat volá příslušné parsovací funkce. Vlákno se také uspává podobně jako vlákno komunikace. Zbuzeno je v okamžiku přidání položky do fronty odpovědí.
6.2. Implementace jednotlivých částí 6.2.1. Časovače Časovač stahování příspěvků a časovač stahování seznamu lidí je implementován pomocí standardního objektu System.Windows.Forms.Timer v instancích tmrText a tmrKontakty. Jejich důležité vlastnosti jsou Enable a Interval. Enable je vlastnost typu Boolean a indikuje funkčnost časovače. Vlastnost Interval je celočíselného typu a určuje periodu v milisekundách, za kterou objekt volá proceduru Tick. Procedura Tick je volaná v rámci běhu hlavního vlákna. Tyto časovače vkládají do fronty požadavků instance struktury sPozadavek a zajišťují tak pravidelnou obnovu příspěvků i seznamu lidí v místnosti.
KAPITOLA 6. POPIS IMPLEMENTACE
19
6.2.2. Fronta požadavků K implementaci fronty požadavků byla použita generická fronta poskytovaná platformní knihovnou: Queue(Of T) inicializovanou datovou strukturou sPozadavek.
Definice struktury sPozadavek: Public Structure sPozadavek Dim DruhPozadavku As eDruhPozadavku Dim DruhDat As eDruhDat Dim Url As String Dim Data As String End Structure
Výčtový typ eDruhPozadavku říká o jaký druh komunikace se jedná pro, upload nabývá hodnoty 1, pro download 2.
Výčtový typ eDruhDat identifikuje typ požadavku – jakých dat se týká: Public Enum eDruhDat As Integer Neurceno Komunikace Kontakty Odesilani Odhlaseni End Enum
Objekt fronty je pojmenován FrontaPozadavku a její velikost je omezena konstantou MaxVelikostFrontyPozadavku. Ke frontě se váže i zámek použitý při přístupu ke frontě. Objekt zámku je nazván LockFrontyPozadavku. Pro přístup k frontě jsou definovány funkce PridejPozadavek a PridejPozadavekEx. Tyto funkce vkládají požadavky do fronty. Pokud je fronta plná, tj. obsahuje MaxVelikostFrontyPozadavku prvků nejsou nové požadavky přidány a je vrácena chybová hodnota. Opačná funkce OdeberPozadavek odebírá požadavek z fronty, má jeden parametr typu sPozadavek předávaný referencí, do kterého funkce vrací data požadavku. Opět je zde využit zámek, pro zajištění konzistence dat.
KAPITOLA 6. POPIS IMPLEMENTACE
20 6.2.3. Komunikace se serverem
Pro komunikaci se serverem byly využity funkce DownloadString a UploadString objektu Client, který je instancí třídy WebClient. Pro komunikaci je ještě potřeba vyplnit data, která Client uvádí v http hlavičce, děje se tak v proceduře Inicializuj, ve které je ještě definované kódování iso-8859-2 pro správnou interpretaci dat v řetězci. Seznam údajů v hlavičce je reprezentován jako kolekce.
Příklad procedury Inicializuj: Public Sub Inicializuj() Client.Headers.Add("user-agent", "Own client") Client.Headers.Add("Accept", "text/html,text/plain;q=0.9") Client.Headers.Add("Accept-Language", "cs") Client.Headers.Add("Accept-Charset", "iso-8859-2") Client.Encoding = System.Text.Encoding.GetEncoding(28592) Inicializovano = True End Sub
Funkce UploadString používá http funkci POST pro upload dat, je tedy vhodná i pro proces přihlašování uživatele. Internetový prohlížeč používá pro uploadovaná data kódování x-www-form-urlencoded, které bohužel nebylo nikde v .NETu definované, takže Client odesílá data ve standardním kódování iso-8859-2, tato skutečnost může způsobovat chybnou interpretaci některých znaků serverem. Funkce DownloadString používá ke komunikaci http funkci GET, která vrací stáhnutá data ze zadané adresy. Obě funkce obsahují kód, který kontroluje a popřípadě doplní specifikaci protokolu na začátek url adresy (http://).
6.2.4. Fronta odpovědí Je stejně jako fronta požadavků implementovaná generickou funkcí Queue(Of T), ale inicializována strukturou sOdpoved, je pojmenovaná jako FrontaOdpovedi. Samozřejmě má také vlastní zámek LockFrontyOdpovedi. Definice struktury sOdpoved: Public Structure sOdpoved Dim DruhDat As eDruhDat Dim Data As String End Structure
I tato fronta má definované funkce PridejOdpoved, PridejOdpovedEx a OdeberOdpoved, implementovány jsou podobně jako u fronty požadavků není tedy nutné je znova popisovat.
KAPITOLA 6. POPIS IMPLEMENTACE
21
6.2.5. Analýza a zpracování příspěvků Funkce, ve které se z html stránky vybírají důležitá data se nazývá ParsujKomunikace. Tato funkce projde data html stránky a snaží se rozeznat v ní jednotlivé příspěvky, ze kterých vytváří struktury sPrispevek jež přidává do fronty aktuálního textu (viz kapitola 6.2.7). Funkce také částečně analyzuje text příspěvků a na základě této analýzy dokáže ovlivnit i seznam lidí v místnosti. Pokud rozpozná text od uživatele, který ještě není v seznamu lidí, přidá uživatele do seznamu. Stejně tak rozeznává výpisy systémových zpráv a na základě nich upravuje seznam lidí (např. rozpozná-li systémovou zprávu Uživatel pi.em vstoupil do místnosti funkce vloží do seznamu lidí uživatele pi.em s mužským pohlavím). Forma příspěvků v html stránce je volání parametrizované funkce javaskriptu: Příklad formátování jednoho příspěvku, které server posílá klientovi: top.a3(496899,'0000ff','Ahojky lidi','nufta','',3356908,0,0,'','M');
Význam všech parametrů nebyl zjištěn, nicméně ty důležité pro komunikaci funkce rozpozná. Algoritmus vyhledávání dat je velmi jednoduchý a čitelný, používá standardní řetězcové operace jako je vyhledávání a kopírování podřetězce. Tato varianta je pro případné změny flexibilnější a také jednoduší na implementaci. Na základě vráceného výsledku z této funkce se generují události SeznamLidiObnoven a po dokončení formátování příspěvků také HtmlPripraveno.
6.2.6. Analýza a zpracování seznamu lidí O analýzu html kódu seznamu lidí se stará funkce ParsujSeznamLidi. Je implementována podobně jako funkce ParsujKomunikaci. Tato funkce na základě analýzy plní strukturu sKontakt a přidává jej do slovníku LideVmistnosti (viz kap. 6.2.8 seznam lidí)
6.2.7. Fronta příspěvků Pro její implementaci byla použita generická fronta inicializovaná strukturou sPrispevek a pojmenovaná AktualniText. Délka fronty je omezena konstantou MaxVelikostAktualnihoTextu.
Deklarace fronty příspěvků AktualniText: Private AktualniText As New Queue(Of sPrispevek)
KAPITOLA 6. POPIS IMPLEMENTACE
22 Definice struktury sPrispevek: Public Structure sPrispevek Dim Text As String Dim OdKoho As String Dim Odkud As String Dim Komu As String Dim Barva As String Dim ID As Long Dim Pohlavi As ePohlavi End Structure
Výčtový typ ePohlavi může nabývat: Public Enum ePohlavi Neurceno Muz Zena Gay Lesbicka End Enum
Pro potřeby vkládání do fronty je implementována funkce PridejDoAktualnihoTextu, vkládá příspěvky do fronty. Manipulace s touto frontou je zabezpečena zámkem LockAktualniText. Funkce si pamatuje ID posledního příspěvku – pomocí něho se ze serveru stahují jen nové příspěvky. Pokud je fronta plná, odebere se tolik starších příspěvků, aby se vešly nové.
6.2.8. Seznam lidí Seznam lidí je tvořen generickým objektem typu slovník, inicializovaný strukturou sKontakt pojmenován jako LideVmistnosti. Deklarace slovníku pro seznam lidí: Public LideVmistnosti As New Dictionary(Of String, sKontakt)
Jako klíč je zvolen řetězec přezdívky, protože pomocí přezdívky se nejčastěji v seznamu vyhledává. Funkce PridejKontaktDoLideVmistnosti vkládá strukturu sKontakt do fronty, avšak kontroluje, jestli se už ve frontě nenachází záznam se stejnou přezdívkou. Do seznamu lidí totiž přispívají obě parsovací funkce, ale jen funkce ParsujSeznamLidi vkládá do seznamu úplné struktury, funkce ParsujKomunikaci vkládá analýzou příspěvku jen neúplně vyplněné struktury, proto vkládací funkce musí dbát na to, aby neúplné struktury byly nahrazovány úplnými a ne naopak.
KAPITOLA 6. POPIS IMPLEMENTACE
23
Při běhu parsovací funkce ParsujSeznamLidi se provádí obnova dat ve slovníku, ale provádí se postupně, ne najednou. Pro účely obnovy dat jsou implementovány funkce ZneplatniLideVmistnosti a SmazNeplatneLidiVmistnosti. První jmenovaná funkce je volána před samotným parsování seznamu lidí, aby nastavila u všech záznamů ve slovníku příznak Nacten na hodnotu false. Tím zapříčiní, že všechny vkládané položky během vykonávání funkce přepíšou ty staré, popřípadě se doplní nové. Na konci parsovací funkce se zavolá druhá z funkcí SmazNeplatneLidiVmistnosti, která projde všechny kontakty a ty, které nebyly aktualizovány jsou odstraněny. Tímto způsobem se obnoví celý seznam kontaktů, který je navíc dostupný i během parsování.
6.2.9. Transformace příspěvků do zobrazitelné formy Příspěvky se zobrazuji pomocí standardní komponenty WebBrowser, která dokáže zobrazit html text. Pro převodu příspěvků na html je implementována funkce GenerujHtmlText. Funkce na začátku nejprve vytvoří lokální seznam všech různých autorů příspěvků a vygeneruje potřebné css definice barev. Pak prochází příspěvky a generuje html kód s použitím dříve definovaných css stylů. Funkce ještě využívá pomocnou funkci OpravTextNicku, která pro potřeby jmenného označení css stylů upravuje přezdívky a nahrazuje tečky za podtržítka a podtržítka v originální přezdívce zdvojuje.
Ukázka generovaného html kódu: <STYLE type="text/css"> .Zpravaradek- {color:#006600} .ZpravaSys {color:#000000;font-size: 12px} .Zpravapi_em {color:#003366}
16:13:01: Uživatel pi.em vstoupil do místnosti
radek-: pi.em:cus
pi.em: radek-: nazdar, nebudu vnímat...
KAPITOLA 6. POPIS IMPLEMENTACE
24
6.3. Hlavní třídy, zobrazení dat 6.3.1. Okno pro výběr místnosti. Okno je instancí knihovní šablony System.Windows.Forms.Form. Formulář je zobrazen hned po spuštění aplikace. V levé části je do stromové struktury uspořádaný seznam místností, který lze procházet, v pravé části se pak zobrazují informace o místnostech aktuálně označených v seznamu. Ve spodní části okna jsou tlačítka pro obnovu seznamu místností a pro vstup do vybrané místnosti (viz obrázek B.1). Vždy před načtením seznamu místností je uživatel tázán, zda chce zobrazit i místnosti se sexuální tématikou, pokud ano, souhlasí s tím, že je starší 18 let a chce ony místnosti zobrazit. Tento dotaz se týká všech dočasných místností v kategorii Sex a vše kolem něj. Toto opatření respektuje chování výpisu místností ve webovém prohlížeči. Pokud si uživatel přeje vstoupit do místnosti, je zobrazeno okno pro přihlášení. Pokud se uživatel úspěšně autentizuje a vstup do místnosti proběhne v pořádku, obě okna (seznam místností i přihlašovací) zmizí a zobrazí se okno s chatem. 6.3.2. Okno pro přihlašování Toto okno je instancí stejné šablony jako okno pro výběr místnosti. Obsahuje pouze dvě textová pole a tlačítko OK pro potvrzení a Zrušit pro zrušení přihlašování. Do prvního textového pole se zadává uživatelské jméno, do druhého heslo. Pole s heslem nezobrazuje přímo text, ale zástupné znaky – hvězdičky (viz obrázek B.2). Okno je zobrazeno jen pro potřebu přihlášení uživatele, je zobrazeno jako modální (tj. z celé aplikace je aktivní jenom toto okno, interakce s jinými okny stejné aplikace jsou potlačeny).
6.3.3. Okno pro chatování V hlavním okně aplikace je pro zobrazení příspěvků použit objekt, který je ve standardní nabídce objektů platformy .NET a jedná se o objekt WebBrowser. Je využíván k zobrazení generovaného html kódu a také k samostatnému zobrazování ikon smajlíků. Jeho obsah je na rozdíl od internetového prohlížeče obnovován jen v případě změny textu (viz obrázek B.3). Pro potřeby zobrazování seznamu lidí v místnosti je použit standardní ListBox, který zobrazuje vlastní kolekci dat, a umožňuje seznam třídit podle abecedy. Pro psaní a odesílání textu jsou použity dva objekty typu TextBox, první je víceřádkový a píše se do něj text příspěvku, menší TextBox je zobrazován jen v případě stisku klávesy TAB a má na starosti automatické doplňování přezdívek podle seznamu lidí v místnosti.
KAPITOLA 6. POPIS IMPLEMENTACE
25
6.3.4. Přístup k prvkům hlavního formuláře z různých vláken Přístupy k prvkům formuláře z jiných vláken než byly vytvořeny je řešen pomocí funkcí poskytovaných samotnými ovládacími prvky. Nejprve musí být volána funkce InvokeRequired prvku, ke kterému chce vlákno přistupovat, tato funkce vrací hodnotu true, pokud se snaží přistupovat z jiného vlákna než z mateřského. Pokud je hodnota false, může se k prvku bezpečně přistupovat, pokud je hodnota true, zavolá se funkce Invoke s parametrem delegáta1 na funkci, která bude přistupovat k prvku (měnit data). Prvek tuto funkci v nebližším možné době vykoná bez rizika poškození dat způsobené přístupem z jiného vlákna.
Definice struktury delegáta: Delegate Sub dZobrazText(ByVal HtmlStranka As String)
6.3.5. Modul klienta Všechny funkce a objekty uvedené v kapitole 6.2 jsou zapouzdřeny do modulu a tvoří tak vlastní objekt. Z objektu definovaného jako modul nelze vytvářet instance, všechny proměnné, funkce a procedury jsou sdílené (Shared). Modul obsahuje veřejné (Public) i neveřejné (Private) objekty a funkce. Pomocí veřejných se k modulu přistupuje a komunikuje s ním. Modul má definovaný několik událostí, přes které dává vědět svůj stav a zprostředkovává některá data.
Definice modulu klienta: Module KlientLide … End Module
Příklad definice události a její vyvolání v modulu: Public Event HtmlPripraveno(ByVal HtmlStranka As String)
1
Delegát je obdoba ukazatele na funkci v jazyku C++
KAPITOLA 7. TESTOVÁNÍ
26
7. Testování
7.1. Alfa testování – testování jednotlivých modulů Jednotlivé funkce byly testovány na množině testovacích dat a později i s daty posílané serverem. Některé funkce byly vyvíjeny mimo hlavní projekt, ale testování již probíhalo v hlavním projektu. Vývojové prostředí i samotný jazyk VisualBasicu poskytuje velmi dobré mechanismy pro testování. Dokáže krokovat běh aplikace a umožňuje měnit prováděný kód či obsah proměnných. Také umožňuje měnit aktuální pozici prováděného příkazu. Pomocí těchto vlastností lze vykonat více větví programu a otestovat tak chování ve více případech najednou.
7.2. Beta testování – testování na úrovni modulů Při testování na úrovni modulů byl důraz kladen hlavně na spouštění a správu vláken, aby nedocházelo ke kolizím, na korektní uspávání a buzení vláken a na jejich správné ukončování. Bylo testováno, zda je zachována konzistence sdílených dat, tj. zda při přístupu k sdílené proměnné je definován a zamknut správný zámek. Dále bylo testována aplikaci na uváznutí vláken, které by znemožňovalo řádné ukončení aplikace. Testování na úrovni modulů bylo zjednodušeno pomocnými výpisy z jednotlivých funkcí, tyto výpisy jsou speciálně určené pro ladění aplikací, při kompilaci finální podoby překladač tyto řádky ignoruje.
7.3. Testování celé aplikace Aplikaci byla testována v ostrém provozu cca 2 týdny několika dobrovolnými uživateli. Během testů se ukázalo, že zvolená koncepce obnovy seznamu lidí je vhodná jen pro místnosti s malým počtem účastníků, neboť prvek zobrazující seznam lidí (ListBox) se při velkém počtu lidí (řádově stovky) obnovuje výrazně pomaleji a vzhledem k časté obnově velice komplikuje práci s ostatními prvky formuláře.
KAPITOLA 8. SROVNÁNÍ S WEBOVÝM KLIENTEM
27
8. Srovnání s webovým klientem Webový klient lze spustit na více operačních systémech, k běhu mu stačí internetový prohlížeč s podporou internetových technologií jako jsou kaskádové styly, rámce, či javaskript. Tyto technologie podporuje většina současných internetových prohlížečů. Proto je využívání chatových služeb prostřednictvím internetových klientů oblíbené. Implementovaný klient na platformě .NET může fungovat podle specifikací jen na systémech Windows a ještě ne všechny verze jsou podporovány, viz [5]. Pro funkci klienta je nutné mít nainstalované prostředí .NET Framework (obdobná situace jako s Java Runtime Environment)
8.1. Výhody a nevýhody webového klienta + + + + + −
nenáročnost provozu – internetový prohlížeč s podporou vyžadovaných technologií je dostupný ve většině základních instalacích GUI prostředí multiplatformní provázanost s ostatními službami serveru Lide i službami portálu Seznam. optimalizovanost služby pro internetový provoz změny lze provádět jen na serveru, všechny změny jsou promítnuty stejně na všechny webové klienty uživatel je odkázán jen na možnosti a funkce, poskytované serverem prostřednictvím internetového prohlížeče
8.2. Výhody a nevýhody Klienta chatu Lidé + − − − −
otevřený projekt, možnost přidávání uživatelských funkcí vázané na prostředí .NET omezení při komunikaci se serverem na http protokol a html strukturu dat poskytuje základní komunikační možnosti, není provázaný s ostatními službami musí reagovat na změny struktury dat posílané serverem, jinak nebude fungovat
Implementovaný klient poskytuje lépe aktualizovaný seznam lidí. V místnosti s velkým počtem lidí (více jak 100) však neustálá aktualizace seznamu lidí zpomaluje reakce programu, proto je tento klient vhodnější pro místnosti s menším nebo průměrným obsazením.
KAPITOLA 9. ZÁVĚR
28
9. Závěr Byl vytvořen klient komunikující s diskusní službou internetového serveru Lidé.cz. Klient umožňuje plnohodnotné využití komunikační služby. Program je řešen modulárně, kdy jsou veškeré interpretující funkce chatu zapouzdřeny do jednoho modulu a je tedy možné jej použít i v jiných programech. Program respektuje rychlost obnovy textu a seznamu lidí zasílané serverem, server je proto zatížen dotazy stejně jako při použití internetového prohlížeče. Klient je svojí strukturou vhodnější do místností s menším či průměrným počtem lidí, ve velkých místnostech nemusí zajistit plnou funkčnost služby. Program nepodporuje přístup přes proxy server, neboť některé servery načítají stránky do vyrovnávací paměti, ze které je pak zobrazují. To by pro funkci chatu nebylo vhodné. Do budoucna může být využit modul komunikace pro tvorbu chatovacích robotů tzv. botů, autonomních programů snažících se komunikovat jako normální uživatel nebo poskytujících různé statistické údaje. Programovací jazyk VisualBasic a platforma .NET poskytly prostředí bohaté na objekty a podporu pro jednoduchý a rychlý návrh GUI. Při implementaci byla snaha co nejvíce využívat poskytované šablony objektů. Podpora implementace vláken a práce s nimi je na této platformě propracovaná a srozumitelná.
KAPITOLA 10. SEZNAM POUŽITÝCH ZDROJŮ
29
10. Seznam použitých zdrojů [1] Internetová encyklopedie Wikipedia http://www.wikipedia.org
[2] Internetové komunikační služby Lidé http://www.lide.cz
[3] Internetový portál Seznam http://www.seznam.cz
[4] M. Gürtler, P. Kocich. Visual Basic .NET Hotová řešení. CP Books a.s, Brno, 1. vydání, 2005 v češtině
[5] Microsoft Visual Studio 2005 Documentation (součástí instalace vývojového prostředí Microsoft Visual Studio)
[6] MSDN Library http://msdn.microsoft.com
[7] Pokyny pro psaní závěrečných a magisterských prací na katedře počítačů http://info336.felk.cvut.cz
[8] Zdrojový kód projektu IRC brána na webchat lide.cz http://www.schizofrenia.org/~p4t0k/python/ostatni/lidegw.py
PŘÍLOHA A. OBRÁZKY WEBOVÉHO KLIENTA
30
A. Obrázky webového klienta
Obrázek A.1: Indikace přihlášeného uživatele
Obrázek A.2: Hlavní nabídka záložkového menu
Obrázek A.3: Seznam lidí v místnosti
PŘÍLOHA A. OBRÁZKY WEBOVÉHO KLIENTA
31
Obrázek A.4: Hlavní okno chatu
Obrázek A.4: Hlavní okno chatu
32
PŘÍLOHA B. OBRÁZKY IMPLEMENTOVANÉHO KLIENTA
B. Obrázky implementovaného klienta
Obrázek B.1: Seznam místností
Obrázek B.2: Dialog pro přihlášení uživatele
PŘÍLOHA B. OBRÁZKY IMPLEMENTOVANÉHO KLIENTA
33
Obrázek B.3: Hlavní chatovací okno s příspěvky
Obrázek B.3: Hlavní chatovací okno s příspěvky
PŘÍLOHA C. STRUKTURA PŘILOŽENÉHO CD
34
C. Struktura přiloženého CD
Obrázek C.1: Struktura přiloženého CD
V adresáři exe je zkompilovaný spustitelný soubor implementovaného klienta Ve framework je instalační soubor prostředí .NET potřebné k běhu klienta Src obsahuje zdrojové soubory pro vývojové prostředí Visual Studio 2005 Text obsahuje tisknutelnou verzi tohoto dokumentu, v podadresáři pictures jsou
všechny použité obrázky Textový soubor install.txt obsahuje informace pro instalaci a spouštění klientského programu. Readme.txt obsahuje poznámky ke struktuře CD Testing.txt obsahuje poznámky k testování