Příklad aplikace Klient/Server s Boss/Worker modelem (informativní)

Podobné dokumenty
Sokety a síťování. Jiří Vokřínek. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Sokety a síťování. Jiří Vokřínek. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Část 1 Síťování. Sokety a síťování. Část 2 Příklad jednoduchý klient a server. Část 3 Příklad aplikace Boss/Worker

Sokety a sí ování. Katedra po íta. Ji í Vok ínek. P edná²ka 9 B6B36PJV Programování v JAVA

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. Téma 12 - Textové soubory a výjimky

KTE / ZPE Informační technologie

Vlákno odlehčený proces kód vlákna, zásobník privátní ostatní sdíleno s dalšími vlákny téhož procesu

Distribuované systémy a výpočty

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Vícevláknové aplikace

Algoritmizace a programování

Vícevláknové aplikace modely a příklady

RMI Remote Method Invocation

Vlákna. První jednoduchý program s vlákny:

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Car Agent. Struktura chování:

Úvod do programovacích jazyků (Java)

Abstraktní datové typy: zásobník

Vlákna. První jednoduchý program s vlákny:

Vláknové programování část V

Zápis programu v jazyce C#

OMO. 4 - Creational design patterns A. Singleton Simple Factory Factory Method Abstract Factory Prototype Builder IoC

Java a XML. 10/26/09 1/7 Java a XML

Část 1 Příklad GUI aplikace Simulátor/Plátno. GUI s plátnem Struktura aplikace Struktura simulátoru Struktura grafického rozhraní Praktické ukázky

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

ZOS 9. cvičení, ukázky kódu. Pavel Bžoch

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

8 Třídy, objekty, metody, předávání argumentů metod

IMPLEMENTACE INFORMAČNÍHO SYSTÉMU VIDIUM V JAZYCE JAVA

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Distribuované systémy a výpočty

Čipové karty Lekařská informatika

Jazyk C# - přístup k datům

typová konverze typová inference

Vícevláknové aplikace modely a příklady

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

Generické programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

NIO. Aplikační programování v Javě (BI-APJ) - 12 Ing. Jiří Daněček Katedra softwarového inženýrství Fakulta informačních technologií ČVUT Praha

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

20. Projekt Domácí mediotéka

Úvod do programování - Java. Cvičení č.4

Java aplety. Předávání parametrů z HTML

Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

5 Rekurze a zásobník. Rekurzivní volání metody

Iterator & for cyklus

Typický prvek kolekce pro české řazení

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Objektově orientované programování

Obsah přednášky. GUI v Javě a událostmi řízené programování. Základní prvky grafického rozhraní. Základní komponenty.

GUI v Javě a událostmi řízené programování

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Java - výjimky. private void vstup() throws IOException {... }

10. Architektura klient/server a třívrstvá architektura

Datové struktury. alg12 1

10. Architektura klient/server a třívrstvá architektura

Teoretické minimum z PJV

VIII. Seminář Java VIII p.1/36

Při studiu tohoto bloku se předpokládá, že student je zvládá základy programování v jazyce Java s využitím vývojového prostředí NetBeans.

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

Programování v jazyce JavaScript

Část 1 Paralelní programování. Vícevláknové aplikace. Část 2 Vícevláknové aplikace. Část 3 Využití vláken v GUI

Bridge. Známý jako. Účel. Použitelnost. Handle/Body

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Robert Haken [MVP ASP.NET/IIS, MCT] software architect, HAVIT, Perly code-review z praxe

IRAE 07/08 Přednáška č. 7. Začátek (head)

Dynamické struktury a Abstraktní Datový Typy (ADT)

Principy objektově orientovaného programování

Část 1 Spojové struktury (stromy) Dynamické struktury a Abstraktní Datový Typy (ADT) Část 2 Abstraktní datový typ. Část 3 Příklad ADT Prioritní fronta

8. přednáška: Soubory a proudy

Základní komunikační operace

Procesy a vlákna - synchronizace

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

17. Projekt Trojúhelníky

Konstruktory a destruktory

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Cvičení č. 2. Komunikace mezi procesy Program Hodiny. 4 body

Regulární výrazy. Vzory

Úvod do programovacích jazyků (Java)

Technologie JavaBeans

Univerzita Palackého v Olomouci Radek Janoštík (Univerzita Palackého v Olomouci) Základy programování 4 - C# 19.2.

Část I Spojové struktury

7. Datové typy v Javě

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

Jazyk C# a platforma.net

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

GUI v Javě a událostmi řízené programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Jini (pronounced GEE-nee) Cvičení 8 - DS 2006

7. Dynamické datové struktury

HTTP. Webový server. generátor HTML stránek (CGI, Perl, PHP, Python, Ruby, Java, ASP.NET) zpracování požadavku/ odeslání odpovědi.

GUI v Javě (připomínka) Návrhář GUI Příklad aplikace MVC Model-View-Controller Události Vnitřní třídy. MVC Model-View-Controller

Seminář Java IV p.1/38

Transkript:

Příklad aplikace Klient/Server s Boss/Worker modelem (informativní) Jan Faigl Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze A0B36PR2 Programování 2 Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 1 / 23

Příklad aplikace Klient/Server s Boss/Worker modelem Příklad vláknové aplikace Server Příklad vláknové aplikace Klient Spuštění jiného programu z procesu Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 2 / 23

Obsah Příklad vláknové aplikace Server Příklad vláknové aplikace Klient Spuštění jiného programu z procesu Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 3 / 23

Příklad vícevláknové aplikace klient/server K serveru se připojí klient, který obdrží parametry pro generování grafu. Klient vrací serveru hash hodnotu řešení nejkratších cest z uzlu 0. Během vlastního řešení musí klient komunikovat se serverem definovaným způsobem a udržovat spojení. Po odeslání výsledku server posílá potvrzení správného / špatného řešení a ukončuje spojení. Není-li spojení správně udržované (periodické), posíláním alive zpráv, ukončuje server spojení. Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 4 / 23

Popis činnosti serveru Po přijetí klienta jsou provedeny následující operace. 1. Poslání parametrů spojení klientu. 2. Čekání na žádost o parametry grafu. 3. Poslání parametrů grafu. 4. Generování grafu, hledání řešení a výpočet hash. 5. Příjem klientského řešení. 6. Porovnání vlastního a klientského řešení. 7. Poslání výsledku porovnání klientu. 8. Ukončení spojení. Během bodu 4 a 5 je nutné hlídat, zda klient udržuje spojení. Klient může poslat řešení dříve než jej nalezne server. Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 5 / 23

Průběh činnosti server obsluha klienta navázání spojení klient výpočet potvrzení spojení žádost o zadání zadání udržování spojení výsledek výpočtu potvrzení výpočtu a ukončení spojení Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 6 / 23

Základní architektura Pro každého připojeného klienta vytvoříme clienthandler, který obsahuje komunikační modul comm, watchdog modul watchdog, který hlídá udržování komunikace s klientem, modul pro řešení zadaní dij, který volá program tdijkstra. Synchronizační mechanismy: fronta událostí, exkluzivní přístup ke sdíleným proměnným. Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 7 / 23

Propojení modulů hlavní vlákno vlákno vlákno komunikační modul nová událost fronta událostí čekání na událost nová událost dij modul watchdog modul vlákno volání rozhraní obsluha události volání rozhraní volání rozhraní Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 8 / 23

Fronta událostí 1 class EventQueue { 2 Queue queue; 3 Object cond; 4 5 6 EventQueue() { queue = new Queue(); 7 cond = new Object(); 8 } 9 10 synchronized void addevent(int event) { 11 queue.push(event); 12 cond.notify(); 13 } 14 15 synchronized int getevent() { 16 if (queue.size() == 0) { 17 cond.wait(); 18 } 19 return queue.pop(); 20 21 } } Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 9 / 23

Modul Dij 1 class Dij extends Thread { 2 EventQueue queue; 3 int number; int seed; int from; 4 int hash; 5 Dij(EventQueue iqueue) { 6 queue = iqueue; 7 8 } public void run() { 9 hash = calltdijkstra(number, seed, from); 10 queue.addevent(solution_found); 11 } 12 synchronized int gethash() { 13 return hash; 14 } 15 synchronized void solve(int n, int s, int f) { 16 if (!isalive()) { 17 number = n; seed = s; from = f; 18 start(); 19 } } 20 synchronized void shutdown() { 21 join(); 22 23 } } Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 10 / 23

Modul Watchdog 1/2 1 public class Watchdog extends Thread { 2 EventQueue queue; 3 int period; 4 int ping; 5 Watchdog(EventQueue iqueue, int iperiod) { 6 queue = iqueue; 7 period = iperiod; 8 } 9 10 11 synchronized void alive() { 12 ping++; 13 } Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 11 / 23

Modul Watchdog 2/2 1 2 public void run() { boolean q = false; 3 while (!q) { 4 sleep(period); 5 6 synchronized(this) { q = quit; 7 if (ping == 0) { 8 eventqueue.add(watchdog_timeout); 9 10 } ping = 0; 11 } 12 } 13 } 14 15 void shutdown() { 16 synchronized(this) { 17 quit = true; 18 19 } join(); 20 21 } } Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 12 / 23

Modul Comm 1/2 1 class Comm extends Thread { 2 NetConnection conn; 3 EventQueue queue; 4 Comm(EventQueue iqueue, NetConnection iconn) { 5 queue = iqueue; 6 conn = icon; 7 } 8 synchronized void shutdown() { 9 if (!isalive()) { 10 conn.stop(); //stop network (blocking receiving) 11 join(); 12 } } 13 private synchronized int parse(commmessage msg) { 14... 15 return msgtype; 16 } 17 int synchronized gethash() { 18 //client hash from network connection 19 return hash; 20 } Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 13 / 23

Modul Comm 2/2 1 public void run() { 2 CommMessage msg; 3 boolean quit = false; 4 //blocking receive 5 while(!quit && (msg = conn.receive()!= null)) { 6 switch(parse(msg)) { 7 case MSG_GETPARAM: 8 queue.addevent(client_getparam); 9 case MSG_ALIVE: 10 queue.addevent(client_alive); 11 break; 12 case MSG_SOLUTION: 13 queue.addevent(client_solution); 14 default: 15 //unknown message 16 quit = true; 17 break; 18 } 19 } 20 //inform main thread 21 queue.addevent(comm_terminated); 22 } Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 14 / 23

Hlavní vlákno 1/3 ClientHandler je vytvořen po navázání spojení. 1 public class ClientHandler extends Thread { 2 EventQueue queue; 3 Watchdog watchdog; 4 Dij dij; 5 Comm com; 6 ClientHandler(NetConnection conn) { 7 queue = new EventQueue(); 8 watchdog = new Watchdog(queue, PERIOD); 9 dij = new Dij(queue); 10 comm = new Comm(queue, conn); 11 12 } start(); 13 14 15 void shutdown() { watchdog.shutdown(); 16 17 comm.shutdown(); dij.shutdown(); 18 queue.addevent(stop); 19 join(); 20 } Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 15 / 23

Hlavní vlákno 2/3 1 public void run() { 2 int ev; 3 boolean clientsolution; boolean mysolution; 4 Param par = new Param(); 5 while (ev = queue.getevent()!= STOP) { 6 switch(ev) { 7 case CLIENT_GETPARAM: 8 par = generateparam(); 9 dij.solve(par.number, par.seed, par.from); 10 comm.sendparam(param); 11 watchdog.start(); 12 break; 13 case CLIENT_ALIVE: 14 watchdog.alive(); 15 break; 16 case CLIENT_SOLUTION: 17 clientsolution = true; 18 queue.addevent(compare); 19 break; 20 case COMM_TERMINATED: 21 queue.addevent(stop); 22 break; Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 16 / 23

Hlavní vlákno 3/3 1 case SOLUTION_FOUND: 2 mysolution = true; 3 queue.addevent(compare); 4 break; 5 case COMPARE: 6 if (clientsolution && mysolution) { 7 if (dij.gethash() == comm.gethash()) { 8 comm.senddisconnect("solution OK"); 9 } else { 10 comm.senddisconnect("solution WRONG"); 11 } 12 queue.addevent(stop); 13 } 14 break; 15 case WATCHDOG_TIMEOUT: 16 comm.senddisconnect("alive timeout"); 17 queue.addevent(stop); 18 break; 19 default://unknown event 20 queue.addevent(stop); 21 break; 22 } 23 } } } Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 17 / 23

Jak implementovat klientskou část? Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 18 / 23

Jak implementovat klientskou část? server navázání spojení klient žádost o zadání udržování spojení výpočet výsledek výpočtu potvrzení výpočtu ukončení spojení Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 18 / 23

Obsah Příklad vláknové aplikace Server Příklad vláknové aplikace Klient Spuštění jiného programu z procesu Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 19 / 23

Propojení modulů hlavní vlákno vlákno vlákno komunikační modul nová událost fronta událostí čekání na událost nová událost dijkstra modul watchdog modul vlákno volání rozhraní obsluha události volání rozhraní volání rozhraní Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 20 / 23

Příklad Spuštění jiného programu z procesu Příklad spuštění jiného programu z Javy program volání spuštění jiného programu stdin proces jiného programu stdout, stderr ukončení programu Identická architektura aplikace (Boss/Worker) Hlavní logika programu je v obsluze hlavní smyčky zpráv Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 21 / 23

Příklad Spuštění jiného programu z procesu Příklad spuštění jiného programu z Javy program volání spuštění jiného programu stdin proces jiného programu stdout, stderr ukončení programu Identická architektura aplikace (Boss/Worker) Hlavní logika programu je v obsluze hlavní smyčky zpráv Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 21 / 23

Obsah Příklad vláknové aplikace Server Příklad vláknové aplikace Klient Spuštění jiného programu z procesu Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 22 / 23

Příklad - spuštění jiného programu z procesu Příklad - spuštění programu tdijkstra z Javy 1 private boolean calldijkstra() { 2 boolean ret = false; 3 try { 4 String cmd = "./tdijkstra -h -n " + size + " -s " + seed; 5 Process child = Runtime.getRuntime().exec(cmd); 6 child.waitfor(); 7 if (child.exitvalue() == 0) { 8 BufferedReader out = new BufferedReader(new InputStreamReader(child.getInputStream())); 9 hash = Integer.parseInt(out.readLine()); 10 ret = true; 11 } else { 12 System.out.println("Error in dijsktra"); 13 } 14 } catch (Exception e) { 15 System.out.println("Error: Exception : " + e.getmessage()); 16 } 17 return ret; 18 } Co se stane při nedostatečné vyrovnávací paměti pro stdout. Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 23 / 23

Příklad - spuštění jiného programu z procesu Příklad - spuštění programu tdijkstra z Javy 1 private boolean calldijkstra() { 2 boolean ret = false; 3 try { 4 String cmd = "./tdijkstra -h -n " + size + " -s " + seed; 5 Process child = Runtime.getRuntime().exec(cmd); 6 child.waitfor(); 7 if (child.exitvalue() == 0) { 8 BufferedReader out = new BufferedReader(new InputStreamReader(child.getInputStream())); 9 hash = Integer.parseInt(out.readLine()); 10 ret = true; 11 } else { 12 System.out.println("Error in dijsktra"); 13 } 14 } catch (Exception e) { 15 System.out.println("Error: Exception : " + e.getmessage()); 16 } 17 return ret; 18 } Co se stane při nedostatečné vyrovnávací paměti pro stdout. Jan Faigl, 2015 A0B36PR2 : Příklad aplikace Boss/Worker (infomativní) 23 / 23