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

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

JAVA V Serializace Java, zimní semestr

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

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

Soubor jako posloupnost bytů

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

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

RMI Remote Method Invocation

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

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

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

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

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

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

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

Úvod do programovacích jazyků (Java)

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

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

Java Výjimky Java, zimní semestr

JAVA V RMI Java, letní semestr

Ú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

Textové soubory. alg9 1

Programování v Javě I. Leden 2008

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

Iterator & for cyklus

Remote Method Invocation RMI

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

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

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

GUI. Systémová integrace pro desktopové aplikace

JAVA RMI Java, letní semestr 2018

Teoretické minimum z PJV

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

UJO Framework. revoluční architektura beans. verze

typová konverze typová inference

Java Enum Java, zimní semestr ,2017 1

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

Abstraktní datové typy: zásobník

Abstraktní třída a rozhraní

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

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

Generické programování

Seminář Java II p.1/43

Principy objektově orientovaného programování

JAVA. Krátce o Reflection API

Typický prvek kolekce pro české řazení

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

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

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

Jak naprogramovat internetovou komunikaci?

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

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

20. Projekt Domácí mediotéka

JAVA. Java Management Extensions JMX

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

Java Řetězce Java, zimní semestr

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

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

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

6. PRÁCE S DATOVÝMI PROUDY

Algoritmizace a programování

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

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

Výčtový typ strana 67

RMI - Distribuované objekty v Javě

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

Tvorba informačních systémů

Identifikátor materiálu: ICT-3-03

PŘETĚŽOVÁNÍ OPERÁTORŮ

1 Úvod do sítí TCP a UDP Porty... 1

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 - řazení objektů

Čipové karty Lekařská informatika

Lambda funkce Novinky v interfaces Streamy Optional - aneb zbavujeme se null. Java 8. Ondřej Hrstka

Katedra měřicí a řídicí techniky, VŠB - Technická univerzita v Ostravě, tř. 17. listopadu, Ostrava-Poruba, Česká republika

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

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/

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

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

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

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

Seminář Java IV p.1/38

Podmínky na zápočet. Java, zimní semestr

Výjimky. v C# a Javě

PREPROCESOR POKRAČOVÁNÍ

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

public static void main(string[] args) { System.out.println(new Main().getClass().getAnnotation(Greet.class).text());

JAVA. Další jazyky kompilovatelné do Java byte-code

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Čá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

Technologie JavaBeans

Regulární výrazy. Vzory

JAVA Moduly Java, letní semestr 2018

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

JAVA JavaBeans Java, letní semestr

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

InputStream. FilterInputStream

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

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Transkript:

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

Funkcionální programování vstup funkce výstup funkce ve FP ~ matematická funkce má parametry vrací výsledek(ky) nemá vedlejší efekty!!! POZOR: I/O operace jsou také vedlejší efekty nevyhazují výjimky také lze posuzovat jako vedlejší efekt pokud možno jsou líné data (seznamy) jsou nemodifikovatelná funkce vracejí nová 2

Líné funkce příklad class DebugPrint { private boolean debug; public void setdebug(boolean d) { debug = d; public void println(string s) { if (debug) { System.out.println(s);... DebugPrint db = new DebugPrint();... db.println("name of the user: " + username); řetězec je potřeba pouze pokud debug == true ALE vytváří se vždy new StringBuffer().append(... 3

Líné funkce lépe class DebugPrint { private boolean debug; public void setdebug(boolean d) { debug = d; public void println(supplier<string> c) { if (debug) { System.out.println(c.get());... DebugPrint db = new DebugPrint();... db.println(() -> "Name of the user: " + username); řetězec se vytvoří pouze pokud je potřeba 4

Nevyhazování výjimek při chybě vracet speciální hodnotu null není vhodné nelze řetězit volání Option<T> třída kontejner pro hodnotu, které může být null metody boolean ispresent() T get() void ifpresent(consumer<? super T> consumer)... získání static <T> Optional<T> empty() static <T> Optional<T> of(t value) static <T> Optional<T> ofnullable(t value) 5

JAVA Serializace 6

Přehled "ukládání" celých objektů objekty "přežívají" mezi běhy programu persistence lightweight persistence explicitní ukládání a obnovování serializované objekty lze přenášet i po síti ukládá se stav objektu atributy kód třídy objektu musí být dostupný 7

Použití java.io.serializable prázdný interface serializovatelný objekt ho musí implementovat ObjectOutputStream potomek OutputStream implementuje DataOutput a ObjectOutput metoda void writeobject(object o) ObjectInputStream potomek InputStream implementuje DataInput a ObjectInput metoda Object readobject() 8

Příklad public class Data implements Serializable { private int d; public Data(int d) {this.d = d; public String tostring() { return super.tostring() + ", d=" +d;... Data data = new Data(1);... ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream("file.dat")); out.writeobject(data);... ObjectInputStream in = new ObjectInputStream( new FileInputStream("file.dat")); data = (Data) in.readobject(); 9

Serializace serializují/deserializují se všechny atributy (i private) modifikátor atributu transient atribut se nebude ukládat neukládají se jen primitivní hodnoty ale i reference rekurzivně se ukládají i všechny objekty z atributů objektu při načítání se objekty vytvoří stejně provázané př. O1 Před serializací O1 Po deserializaci O2 O3 O2 O3 O4 O4 10

Vlastní serializace interface Externalizable rozšiřuje Serializable dvě metody void readexternal(objectinput in) void writeexternal(objectoutput out) objekty implementují Externalizable místo Serializable dál je vše stejné (téměř) modifikátor transient nemá žádný význam ukládání/načítání se provádí přes metody writeexternal a readexternal writeexternal a readexternal se volají automaticky 11

Příklad public class Data2 implements Externalizable { public Data2() { System.out.println("Data2"); public void writeexternal(objectoutput out) throws IOException { System.out.println("Data2.writeExternal"); public void readexternal(objectinput in) throws IOException, ClassNotFoundException { System.out.println("Data2.readExternal");... Data2 d = new Data2(); ObjectOutputStream o =... o.writeobject(d);... ObjectInputStream i =... d = (Data2) o.readobject(); 12

Nefunkční příklad public class Data3 implements Externalizable { Data3() { System.out.println("Data3"); public void writeexternal(objectoutput out) throws IOException { System.out.println("Data3.writeExternal"); public void readexternal(objectinput in) throws IOException, ClassNotFoundException { System.out.println("Data3.readExternal");... Data3 d = new Data3(); ObjectOutputStream o =... o.writeobject(d);... ObjectInputStream i =... d = (Data3) o.readobject(); // nastane výjimka!! 13

Načítání objektů implicitní serializace (implementování Serializable) při načítání objektů se nevolá konstruktor objekt se vytváří přímo vlastní serializace (implementování Externalizable) nejdřív se zavolá konstruktor základní konstruktor bez parametrů musí být dostupný pak se na objektu zavolá readexternal() 14

Vlastní serializace jiný postup implementovat interface Serializable přidat 2 magické metody private void writeobject(objectoutputstream stream)throws IOException; private void readobject(objectinputstream stream) throws IOException, ClassNotFoundException obě metody musejí mít přesně dodržet danou hlavičku musejí být private v readobject() a writeobject() lze pomocí metod defaultreadobject() a defaultwriteobject() vyvolat implicitní uložení/načtení 15

Příklad public class Test implements Serializable { private String a; private transient String b; public Test(String aa, String bb) { a = "Not Transient: " + aa; b = "Transient: " + bb; private void writeobject(objectoutputstream stream) throws IOException { stream.defaultwriteobject(); stream.writeobject(b); private void readobject(objectinputstream stream) throws IOException, ClassNotFoundException { stream.defaultreadobject(); b = (String)stream.readObject(); 16

Další magické metody private void readobjectnodata() throws ObjectStreamException volá se při načítání objektu, pokud některá z jeho tříd (třída a nadtřídy) není uložena ve streamu použití při změně hierarchie mezi uložením a načtením př: uložím objekt třídy Monkey, která dědí od Animal načítám objekt třídy Monkey, která dědí od Mammal a ta od Animal (metoda se použije na třídě Mammal) cokoliv Object readresolve() throws ObjectStreamException pokud metoda existuje, deserializace objektu dané třídy vrátí to, co tahle metoda cokoliv Object writereplace() throws ObjectStreamException pokud existuje, serializuje se to, co vrátí 17

serialversionuid cokoliv static final long serialversionuid = hodnota pokud při deserializaci nesouhlasí uložená hodnota s hodnotou ve třídě, vypadne InvalidClassException nemusí se používat vytvoří se automaticky při používání serializace explicitní deklarace se silně doporučuje 18

Serializace a std knihovna mnoho tříd ve standardních knihovnách implementuje Serializable pozor serializace nemusí fungovat mezi různými verzemi Javy obvykle varování v dokumentaci Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications... 19

JAVA Preference 20

Přehled balík java.util.prefs od JDK 1.4 určeno pro ukládání a načítání konfigurace programů automatické ukládání/načítání kam se ukládá, záleží na OS zvlášť pro každého uživatele pouze primitivní typy a řetězce (max. 8 KB dlouhé) dvojice klíč hodnota neimplementuje interface Map hierarchická struktura (strom) obvykle jen jeden uzel 21

Získání statické metody na třídě Preferences Preferences usernodeforpackage(class c) vrací uzel preferencí asociovaný s balíkem dané třídy Preferences systemnodeforpackage(class c) jako předchozí metoda společné pro všechny uživatele př: p = Preferences.userNodeForPackage(Foo.class) jméno uzlu ~ plný název balíku tečky se nahradí lomítky "/" 22

Příklad public class Prefs { public static void main(string[] args) { Preferences prefs = Preferences.userNodeForPackage(Prefs.class); prefs.put("url", "http://somewhere/"); prefs.putint("port", 1234); prefs.putboolean("connected", true); int port = prefs.getint("port", 1234); String[] keys = prefs.keys(); for (int i; i<keys.length; i++) { System.out.println(keys[i] + ": "+ prefs.get(keys[i], null)); 23

Metody String get(string key, String def) vrací hodnotu klíče musí se zadávat implicitní hodnota int getint(string key, int def) jako get postupně pro všechny typy void put(string key, String val) přiřadí klíči hodnotu definována i pro ostatní prim. typy String[] keys() vrací všechny klíče void flush() zapíše všechny změny 24

Metody void clear() smaže všechny preference v uzlu String name() jméno uzlu String absolutepath() absolutní jméno uzlu všechny metody jsou bezpečné vůči vláknům lze používat i z více JVM naráz 25

JAVA Komunikace po síti 26

Přehled balík java.net od JDK1.0 snadná komunikace po síti téměř jako používání souborů streamy po síti protokoly TCP a UDP Internet 27

TCP/IP model Application layer HTTP FTP...... Transport layer TCP UDP Internet layer IP Network interface layer ethernet... 28

java.net URI a URL 29

java.net.uri reprezentace URI unique resource identifier (RFC 2396) struktura URI [scheme:]scheme-specific-part[#fragment] absolutní URI obsahuje schema relativní URI nemá schema "opaque" URI specifická část nezačíná lomítkem př: mailto:java-net@java.sun.com news:comp.lang.java hierarchické URI buď absolutní URI začínající lomítkem nebo relativní URI př: http://java.sun.com/j2se/1.3/../../../demo/jfc/swingset2/src/swingset2.java 30

java.net.uri hierarchické URI - struktura [scheme:][//authority][path][?query][#fragment] authority [user-info@]host[:port] všechny části URI jsou typu String, pouze port je typu int normalizace URI odstranění a nahrazení "." a ".." 31

java.net.uri: metody String getscheme() String getschemespecificpart() String getpath() String gethost()... boolean isabsolute() boolean isopaque() void normalize() URL tourl() vytvoří URL z URI výjimka pokud nelze 32

java.net.url URL je specialní případ URI unique resource locator určování zdrojů na webu http://www.mff.cuni.cz/ podobné metody jako u URI get... InputStream openstream() otevře stream pro čtení souboru určeného pomocí URL URLConnection openconnection() vytvoří spojení na URL objekt 33

URLConnection reprezentace spojení mezi aplikací a URL použití 1. získání spojení (openconnection()) 2. nastavení parametrů např. setusecaches() 3. vytvoření spojení (connect()) vzdálený objekt se stane přístupný 4. získávání obsahu a informací obsah getcontent() hlavičky getheaderfield() streamy getinputstream(), getoutputstream() další getcontenttype(), getdate(),... 34

java.net Identifikace (DNS) 35

InetAddress reprezentuje IP adresu získání adresy statické metody na InetAddress InetAddress getbyname(string host) IP adresa pro dané jméno počítače pro null vrátí localhost InetAddress getbyaddress(byte[] addr) IP adresa pro danou adresu délka addr pole 4 pro IPv4, 16 pro IPv6 InetAddress getlocalhost() vrátí adresu pro localhost (127.0.0.1) 36

Příklad public class InetName { public static void main(string[] args) throws Exception { InetAddress a = InetAddress.getByName(args[0]); System.out.println(a); public class Localhost { public static void main(string[] args) throws Exception { System.out.println(InetAddress.getByName(null)); System.out.println(InetAddress.getLocalHost()); 37

java.net Sokety 38

Přehled soket = zakončení spojení TCP spolehlivá komunikace spojení jsou obousměrná lze získat IntputStream a OutputStream třída ServerSocket vytvoří "poslouchací" soket metoda accept() čeká na příchozí spojení vrátí soket pro komunikaci třída Socket soket pro komunikaci 39

Příklad: jednoduchý server try (ServerSocket s = new ServerSocket(6666)) { System.out.println("Server ready"); try (Socket socket = s.accept()) { InputStream in = socket.getinputstream(); OutputStream out = socket.getoutputstream(); while (true) {... in.read();... out.write(...);... 40

Příklad: jednoduchý klient InetAddress addr = InetAddress.getByName(null); Socket socket = new Socket(addr, 6666); try (InputStream in = socket.getinputstream(); OutputStream out = socket.getoutputstream()) { while (...) (... out.write(...);... in.read();... 41

Obsluha příchozích požadavků předchozí příklad jednoduchý server obsluhuje jen jedno spojení obsluha více spojení pro každé příchozí spojení vytvořit vlákno channels a třída Selector obsluha více požadavků v jednom vláknu selektor drží množinu soketů metoda select() čeká dokud aspoň jeden soket není připraven k použití obdoba funkce select() na UNIX systémech 42

Vícevláknový server class ServeConnection extends Thread { private Socket socket; private InputStream in; private OutputStream out; public ServeConnection(Socket s) throws IOException { socket = s; in =...; out =...; start(); public void run() { while (true) { in.read(); out.write(...); public class Server { public static void main(string[] args) throws IOException { ServerSocket s = new ServerSocket(6666); while(true) { Socket socket = s.accept(); new ServeConnection(socket); 43

java.net UDP 44

Přehled nespolehlivá komunikace třída DatagramSocket jak pro server tak pro klienta posílají/přijímají se datagramy void send(datagrampacket d) void receive(datagrampacket d) třída DatagramPacket datagram void setdata(byte[] buf) byte[] getdata() nastaví nebo vrátí bufer pro datagram int getlength() void setlength(int a) délka dat v datagramu 45

Java, zimní semestr Verze prezentace 2017 J10.cz.2017.01 Tato prezentace podléhá licenci Creative Commons Uveďte autora-neužívejte komerčně 4.0 Mezinárodní License. 46