Vstup/Výstup, Sokety. Duben 2012

Podobné dokumenty
Proudy, Zpracovсnэ XML. Radek Koэ

Seminář Java VI p.1/33

6. PRÁCE S DATOVÝMI PROUDY

Práce se soubory v Javě

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

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

InputStream. FilterInputStream

14. Vstupy a výstupy v Javě

Soubor jako posloupnost bytů

Úvod do programovacích jazyků (Java)

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

Programování v Javě I. Únor 2009

Programování v Javě I. Leden 2008

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

Textové soubory. alg9 1

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

Komunikace v sítích TCP/IP (2)

Úvod do programovacích jazyků (Java)

Úvod Virtuální kanál TCP Datagramová služba UDP URL TCP, UDP, URL. Fakulta elektrotechnická

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

typová konverze typová inference

Semin aˇr Java V yjimky Radek Ko ˇc ı Fakulta informaˇcn ıch technologi ı VUT Unor 2008 Radek Koˇc ı Semin aˇr Java V yjimky 1/ 25

Programování v jazyku Java Java a Internet, základní pojmy, socketové x datagramové spojení, klient - server architektura.

Teoretické minimum z PJV

UNIVERZITA PARDUBICE. Fakulta elektrotechniky a informatiky. Aplikace tříd souvisejících s přenosem dat mezi operační pamětí a diskem Marek Jelínek

Soketové připojení Klient InetAddress getbyname() UnknowHostException SecurityException Socket getinputstream() getoutputstream() IOException Server

Design time - vytváří se program - metadata - vytváří se např. třída. Run time - běh programu - ukládá se do paměti počítače - vytváří se např.

Se vznikem internetu se můžeme na síťovou komunikaci v Javě (komunikace mezi více JVM) dívat dvěma pohledy-způsoby:

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

UJO Framework. revoluční architektura beans. verze

Vytváření a použití knihoven tříd

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

Základy objektové orientace I. Únor 2010

7. Datové typy v Javě

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

Soubory. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 12 A0B36PR1 Programování 1

Webové služby a XML. Obsah přednášky. Co jsou to webové služby. Co jsou to webové služby. Webové služby a XML

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

Tvorba informačních systémů

Abstraktní datové typy: zásobník

Přednáška 2. Systémy souborů OS UNIX. Nástroje pro práci se souborovým systémem. Úvod do Operačních Systémů Přednáška 2

Typický prvek kolekce pro české řazení

Soubory. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 12 A0B36PR1 Programování 1

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

NSWI096 - INTERNET JavaScript

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

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

Podpora XML v.net. Podpora XML v.net. nezávislý publicista. Jirka Kosek.

JAVA. Ještě k funkcionálnímu programování (pokračování z předchozí přednášky)

Seminář Java II p.1/43

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

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

Principy objektově orientovaného programování

RMI Remote Method Invocation

Seminář Java IV p.1/38

Algoritmizace a programování

KTE / ZPE Informační technologie

Google Web Toolkit. Martin Šurkovský, SUR března Katedra informatiky

<surface name="pozadi" file="obrazky/pozadi/pozadi.png"/> ****************************************************************************

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Enterprise Java (BI-EJA) Technologie programování v jazyku Java (X36TJV)

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

Úvod Jednoduchá komunikace Sockety Konec. Programování v C# Síťová komunikace. Petr Vaněček 1 / 33

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Remote Method Invocation RMI

1 Nejkratší cesta grafem

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

Rozhraní SAX, SAX vs. SAX2. Jaroslav Ciml

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

XML terminologie a charakteristiky. Roman Malo

Distribuované systémy a výpočty

Iterator & for cyklus

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

1. Programování proti rozhraní

Java a Caché IV: Manipulace s objekty

PREPROCESOR POKRAČOVÁNÍ

VISUAL BASIC. Práce se soubory

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

Zápis programu v jazyce C#

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Rozhraní pro práci s XML dokumenty. Roman Malo

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Programovací jazyk Java

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

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

Z. Kotala, P. Toman: Java ( Obsah )

boolean hasnext() Object next() void remove() Kolekce

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Tvorba informačních systémů

APLIKACE XML PRO INTERNET

Výčtový typ strana 67

Výjimky. v C# a Javě

RMI - Distribuované objekty v Javě

Michal Krátký, Miroslav Beneš

20. Projekt Domácí mediotéka

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

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

Návrh softwarových systém. Návrh softwarových systémů

Java a národní prostředí

Transkript:

Seminář Java Vstup/Výstup, Sokety Radek Kočí Fakulta informačních technologií VUT Duben 2012 Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 1/ 54

Obsah Vstup/Výstup koncepce proudů soubory, adresáře binární proudy znakové proudy filtrované proudy komprimace serializace Zpracování XML dokumentů Sokety Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 2/ 54

Koncepce i/o operací Balíčky java.io základní knihovna pro práci s proudy java.nio alternativní knihovna od verze 1.4+ (new IO) I/O operace založeny na i/o proudech transparentní platformově nezávislé Datový proud libovolný datový zdroj či cíl schopný zpřístupnit/přijmout libovolné datové bloky reprezentován objektem ukrývání detailů (skutečné akce se skutečným i/o zařízením) Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 3/ 54

Koncepce i/o operací Proudy jako stavebnice každá třída reprezentuje jeden typ proudu (definuje jeho vlastnosti operace) nové vlastnosti se dají získat vkládáním objektů (proudů) do sebe... is = new InputStream(...); bis = new BufferedInputStream(is);... Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 4/ 54

Práce se soubory Třídajava.io.File obaluje fyzické soubory (adresáře, linky) na disku speciality systémů souborů (transparentní odlišení) char File.separatorChar ( / nebo \ ) String File.separator char File.pathSeparatorChar ( : nebo ; ) String File.pathSeparator System.getProperty("user.dir") adresář uživatele s jehož UID byl spuštěn proces JVM soubor (adresář) je reprezentován v objektu abstraktním pathname při přístupu k zařízení se konvertuje na systémově zavislé jméno vytvořením instance třídyfile se k zařízení nepřistupuje! Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 5/ 54

TřídaFile Kostruktory File(String pathname) vytvoří instancifile konvertováním řetězcepathname na abstraktní pathname File(String parent, String child) vytvoří instancifile z řetězceparent a řetězcechild File(File parent, String child) vytvoří instancifile z abstraktního pathname objektuparent pathname a řetězcechild File(URI uri) vytvoří instanci File konvertováním danéhofile:uri na abstraktní pathname Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 6/ 54

TřídaFile Testovací operace boolean exists() boolean isfile() boolean isdirectory() boolean canread() boolean canwrite()... Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 7/ 54

TřídaFile Vytvoření souboru (adresáře) boolean createnewfile() vytvoří nový prázdný soubor podle abstraktníhopathname; vrací true, pokud se oprace zdaří boolean mkdir() vytvoří adresář... boolean mkdirs() jako boolean mkdir(), vytváří i adresářovou strukturu, pokud je potřeba... Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 8/ 54

TřídaFile Vytvoření dočasného (temporary) souboru static File createtempfile(string prefix, String suffix) vytvoří dočasný soubor ve standardním adresáři static File createtempfile(string prefix, String suffix, File directory) vytvoří dočasný soubor v uvedeném adresáři Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 9/ 54

TřídaFile Další vlastnosti boolean delete() boolean renameto(file dest) long length() long lastmodified() String getname() String getpath() String getabsolutepath() String getparent()... Všechny vlastnosti a operace viz API documentation Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 10/ 54

Ukázka práce s adresáři File String[] list() vrací pole řetězců reprezentujících jména souborů a adresářů v adresáři daném abstraktnímpathname String[] list(filenamefilter filter) vrací pole řetězců reprezentujících jména souborů a adresářů v adresáři daném abstraktnímpathname, které odpovídají filtru Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 11/ 54

Ukázka práce s adresáři File File[] listfiles() vrací pole abstraktníchpathname reprezentujících soubory a adresáře v adresáři daném abstraktním pathname File[] listfiles(filefilter filter) vrací pole abstraktníchpathname reprezentujících soubory a adresáře v adresáři daném abstraktním pathname, které odpovídají filtru File[] listfiles(filenamefilter filter) vrací pole abstraktníchpathname reprezentujících soubory a adresáře v adresáři daném abstraktním pathname, které odpovídají filtru Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 12/ 54

Ukázka práce s adresáři Rozhraní FilenameFilter definuje jednu metodu boolean accept(file dir, String name) test, zda uvedený soubor by měl být obsažen v seznamu Rozhraní FileFilter definuje jednu metodu boolean accept(file pathname) test, zda uvedený abstraktnípathname by měl být obsažen v seznamu Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 13/ 54

Ukázka práce s adresáři File cesta = new File("."); String[] seznam; seznam = cesta.list(new FilenameFilter() { public boolean accept(file adr, String cesta) { String soubor = new File(cesta).getName(); return soubor.indexof("x")!= -1; } }); } for(string name : seznam) { System.out.println(name); } Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 14/ 54

Binární proudy Vstupní (odvozeny od abstraktní třídyinputstream) pole bytů soubor String roura... Výstupní (odvozeny od abstraktní třídyoutputstream) pole bytů soubor... Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 15/ 54

Vstupní binární proudy Operace void close() uzavře proud, uvolní zdroje abstract int read() čte byte, pokud nelze, vrací -1 int read(byte[] b) čteb.length bytů int read(byte[] b, int off, int len) čte len bytů z proudu od poziceoff long skip(long n) přeskočínbytů void mark(int readlimit) poznačí aktuální pozici (readlimit je počet bytů, které lze přečíst, než se značka stane nevalidní) void reset() obnovení pozice uchované při volání mark() boolean marksupported() Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 16/ 54

Vstupní binární proudy Odvozené od FilterInputStream InputStream java.io.bufferedinputstream proud s vyrovnávací pamětí java.util.zip.checkedinputstream proud s kontrolním součtem javax.crypto.cipherinputstream proud dešifrující data java.io.datainputstream proud s metodami pro čtení hodnot primitivních datových typů... Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 17/ 54

Výstupní binární proudy analogicky k vstupním InputStream OutputStream... Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 18/ 54

Ukázka InputStream fis = new FileInputStream("t.tmp"); InputStream bis = new BufferedInputStream(fis); byte[] buffer = new byte[10]; int res = bis.read(buffer,0,10); System.out.println("Pocet prect. znaku:" + res); for(byte b : buffer) System.out.println(b); bis.mark(20); res = bis.read(buffer,0,10); System.out.println("Pocet prect. znaku:" + res); for(byte b : buffer) System.out.println(b); Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 19/ 54

Ukázka bis.reset(); int b = bis.read(); System.out.println("Prect. znak po resetu:" + b); System.out.println("Prect. znak po resetu:" + (byte)b); bis.close(); Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 20/ 54

Znakové proudy Vstupní (odvozeny od abstraktní třídyreader) BufferedReader PipedReader InputStreamReader FileReader InputStreamReader... Výstupní (odvozeny od abstraktní třídywriter) BufferedReader PipedWriter InputStreamWriter FileWriter InputStreamWriter... Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 21/ 54

Konverze mezi proudy Z binárního proudu (vstupní/výstupní) lze vytvořit proud znakový (vstupní/výstupní) // vytvoříme binární vstupní proud InputStream is =... // z is vytvoříme znakový proud (pro // dekódování se pouˇzije std. znaková sada) Reader isr = new InputStreamReader(is); // znakové sady jsou v balíku java.nio Charset chrs = java.nio.charset.charset.forname("iso-8859-2"); // z is vytvoříme znakový proud (pro // dekódování se pouˇzije jiná znaková sada) Reader isr2 = new InputStreamReader(is, chrs); Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 22/ 54

Ukázka InputStream fis = new FileInputStream("t.tmp"); /*1*/ Reader isr = new InputStreamReader(fis); /*2*/ Reader isr = new InputStreamReader(fis, Charset.forName("ISO-8859-2")); Reader br = new BufferedReader(isr); char[] buffer = new char[10]; res = br.read(buffer,0,10); System.out.println("Pocet prect. znaku:" + res); for(char b : buffer) System.out.println(b); br.mark(20);... Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 23/ 54

Standardní vstup a výstup Ve třídějava.lang.system static InputStream in static PrintStream out static PrintStream err Změna standardních proudů setin(inputstream in) setout(printstream out) seterr(printstream err) Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 24/ 54

Ukázka recode Reader r = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(r); OutputStream fos = new FileOutputStream("o.tmp"); Writer w = new OutputStreamWriter(fos, Charset.forName("ISO-8859-2")); PrintWriter out = new PrintWriter(w, true); String line; while((line = in.readline()).length()!= 0) { out.println(line); } out.close(); Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 25/ 54

Komprimace Packagejava.util.zip BufferedReader in = new BufferedReader( new FileReader(args[0])); BufferedOutputStream out = new BufferedOutputStream(new GZIPOutputStream( new FileOutputStream(args[1]))); int b; while((b = in.read())!= -1) out.write(b); in.close(); out.close(); Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 26/ 54

Serializace objektů Serializace perzistence objektů získání reprezentace objektu jako sekvence bytů uložení reprezentace do souboru Deserializace rekonstrukce serializovaného objektu Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 27/ 54

Serializace objektů Serializovaný objekt musí implementovat rozhraníjava.io.serializable nemá žádné metody, slouží pouze pro identifikaci serializovatelného objektu všechny podřídy třídy, která implementuje toto rozhraní, jsou také serializovatelné proměnné objektu, které nemají být serializovány, musí být označeny modifikátoremtransient pokud je při (de)serializace nutné speciální chování, musí objekt definovat tyto metody private void readobject(objectinputstream is) private void writeobject(objectoutputstream os) viz API projava.io.serializable Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 28/ 54

Serializace objektů příklad class Clovek implements Serializable { String jmeno; protected Clovek() { } public Clovek(String jmeno) { this.jmeno = jmeno; } public String info() { return jmeno; } } Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 29/ 54

Serializace objektů příklad private static final String soubor = "clovek.dat"; public static void serializuj(clovek p) throws IOException { FileOutputStream fos = new FileOutputStream(soubor); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeobject(p); fos.close(); } Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 30/ 54

Serializace objektů příklad public static Clovek deserializuj() throws IOException, ClassNotFoundException { FileInputStream fis = new FileInputStream(soubor); ObjectInputStream ois = new ObjectInputStream(fis); Clovek p = (Clovek)ois.readObject(); fis.close(); return p; } Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 31/ 54

Práce s XML XML je standard konsorcia W3C jak vytvářet značkovací jazyky ideově vychází ze zhruba o deset let mladšího standardu SGML (Structure Generalized Markup Language). XML není jeden konkrétní značkovací jazyk je to specifikace určující, jak mají vypadat značkovací jazyky je to metajazyk konceptuálně jde o zjednodušení SGML standardu, aby se usnadnila práce tvůrcům parserů (analyzátorů) a aplikací se základním standardem úzce souvisejí další, např. XML Namespaces, XInclude, XML Base. společně s dalšími standardy (XSLT, XSL-FO, XHTML, CSS...) tvoří rodinu standardů XML. Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 32/ 54

Struktura XML dokumentu Logická Fyzická dokument se člení na elementy (jedna z nich je kořenová), atributy elementů, textové uzly v elementech, intrukce pro zpracování, notace, komentáře dokument je reprezentován stromem elementů jeden logický dokument může být uložen ve více fyzických jednotkách (entitách); vždy alespoň v jedné document entity. <!ENTITY kap1 SYSTEM "kapitola1.xml"> <!ENTITY swn "Softwarové noviny"> Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 33/ 54

Zpracování XML dokumentu Hlavní typy rozhraní pro zpracování XML dat: Stromově orientovaná rozhraní (Tree-based API) Rozhraní založená na událostech (Event-based API) Rozhraní založená na vytahování událostí/prvků z dokumentu (Pull API) Implementace pro Javu parsery součást JAXP (Java API for XML Processing) http://java.sun.com/xml/jaxp/index.html nezávislé např. http://dom4j.org Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 34/ 54

Tree-based API Mapují XML dokument na stromovou strukturu v paměti dovolují libovolně procházet vzniklý strom; nejznámější je Document Object Model (DOM) konsorcia W3C,viz http://www.w3.org/dom Modely specifické pro konkrétní prostředí pro Javu: JDOM http://jdom.org pro Javu: dom4j http://dom4j.org pro Python: 4Suite http://4suite.org Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 35/ 54

Event-based API Při analýze dokumentu generují události (podle toho, kde se nacházejí) zpracovávající aplikace implementuje obsluhu těchto událostí (pomocí metod callback) událostmi řízená rozhraní jsou nižší úrovně než stromová (pro aplikaci zůstává více práce ) jsou úspornější na paměť (i čas), samotná analýza nevytváří trvalé objekty Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 36/ 54

Event-based API Událost je... začátek a konec dokumentu (start document, end document) komentář (comment) odkaz na entitu (entity reference)... Nejznámějším rozhraním je SAX (http://www.saxproject.org) Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 37/ 54

Event-based API Ukazka <?xml version="1.0"?> <doc> <para>hello, world!</para> </doc> Sled udalosti: start document start element: doc {seznam atributu: prazdny} start element: para {seznam atributu: prazdny} characters: Hello, world! end element: para end element: doc end document Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 38/ 54

Zdroje informací World Wide Web Consortium (W3C) http://www.w3.org/ XML Startkabel (EN/NL): aktuality, odkazy http://xml.startkabel.nl Soubor tutoriálů a on-line referencí v mnoha jazycích http://zvon.org O Reilly XML.COM: články, tutoriály atd. na vysoké technické úrovni http://www.xml.com Free XML Software (L. M. Garshol): kolekce odkazů na nekomerční XML software http://www.garshol.priv.no/download/xmltools/ J. Kosek: http://kosek.cz/xml/ Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 39/ 54

Sokety Připojení k síti Porty obvykle jedno fyzické připojení všechna data procházejí tímto připojením problém přiřazení konkrétních dat konkrétní aplikaci protokoly TCP a UDP mapují data na jednotlivé procesy podle portů port je 16bitové číslo 0 1023 vyhraženo pro standardní služby (http, ssh,...) adresace dat = adresa stroje (IP) + port Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 40/ 54

Java a sítě Balíčekjava.net Podpora komunikace s TCP URL URLConnection Socket ServerSocket Podpora komunikace s UDP DatagramPacket DatagramSocket MulticastSocket Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 41/ 54

Sokety Sokety komunikace typu klient server server čeká na žádost (připojení) klienta klienti se připojují na server server vytváří spojení klient i server zasílají/čtou data vytvořené spojení soket na straně klienta soket na straně serveru komunikace prostřednictvím proudů Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 42/ 54

Sokety Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 43/ 54

Třídajava.net.Socket java.net.socket reprezentuje jednu stranu komunikace soket na straně klienta žádost o vytvoření spojení se serverem new Socket(String host, int port) new Socket(InetAddress address, int port) čtení ze soketu získání vstupního proudu InputStream getinputstream() zápis do soketu získání výstupního proudu OutputStream getoutputstream() Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 44/ 54

Třídajava.net.ServerSocket java.net.serversocket reprezentuje server není potomek třídy Socket! po připojení klienta vytváří objekt třídysocket vytvoření serveru new ServerSocket(int port) port na kterém server naslouchá naslouchání spojení metodaaccept() blokující operace vytváří objekt třídysocket Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 45/ 54

Sokety Metody getport() getlocalport() getinetaddress() getlocaladdress()... Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 46/ 54

Sokety: ukázka aplikace (Server) ServerSocket ss = new ServerSocket(9000); Socket s = ss.accept(); BufferedReader in = new BufferedReader( new InputStreamReader(s.getInputStream())); PrintStream out = new PrintStream( s.getoutputstream()); System.out.println(in.readLine()); out.print("server"); out.flush(); out.close(); in.close() s.close(); ss.close(); Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 47/ 54

Sokety: ukázka aplikace (Klient) try { s = new Socket("localhost", 9000); System.out.println("Client: new socket port " + s.getlocalport()); out = new PrintStream(s.getOutputStream()); out.print("klient"); out.flush(); out.close(); s.close(); } catch (UnknownHostException ex) {... } catch (java.io.ioexception ex) {... } Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 48/ 54

Sokety: ukázka aplikace Problém uvedené ukázky obslouží pouze jednoho klienta a pak skončí nekonečná (podmíněná) smyčka ServerSocket ss; try { ss = new ServerSocket(9000); while(true) { Socket s = ss.accept(); // obsluha klienta s } ss.close(); } catch (java.io.ioexception ex) {... } Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 49/ 54

Sokety: ukázka aplikace Problém uvedené ukázky při obsluze klienta nemůže obsloužit další souběžné obsloužení klientů vlákna ServerSocket ss; try { ss = new ServerSocket(9000); while(true) { Socket s = ss.accept(); (new ClientThread(s)).start(); } ss.close(); } catch (java.io.ioexception ex) {... } Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 50/ 54

Sokety: ukázka aplikace class ClientThread extends Thread { Socket s; public ClientThread(Socket s) { super(); this.s = s; } } public void run() { try { // obsluha klienta s s.close(); } catch (java.io.ioexception ex) {... } } Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 51/ 54

Implementace jednoduchého WWW serveru public class WebServer { public static void main(string[] argv) { new WebServer().start(); } public void start() { try { ServerSocket ss = new ServerSocket(9000); for (int conns = 0; conns < 1; conns++) { Socket s = ss.accept(); (new WebClientThread(s)).start(); } ss.close(); } catch (java.io.ioexception ex) {... } } } Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 52/ 54

Implementace jednoduchého WWW serveru class WebClientThread extends Thread { Socket s; public WebClientThread(Socket s) { super(); this.s = s; } public void run() { try { PrintStream out = new PrintStream( s.getoutputstream()); out.print("<html>");... out.print("<p>time: " + (new java.util.date()).tostring());... } catch (java.io.ioexception ex) {... } } } Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 53/ 54

Zdroje informací http://download.oracle.com/javase/1.5.0/ docs/guide/net/ http://www.javaworld.com Radek Kočí Seminář Java Proudy, Zpracování XML, Sokety 54/ 54