You are on page 1of 23

Napredne Web tehnologije i servisi

Dr.sc. Dragutin Kermek


Sveuilite u Zagrebu
Fakultet organizacije i informatike
Pavlinska 2, Varadin 42000
dkermek@foi.hr

4. dio

Napredno programiranje u PJ java

U/I podrka. Serializacija objekata.


Programiranje mrenih resursa.

Napredne Web tehnologije i servisi - FOI


2

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

U/I podrka
U/I podrka temelji se na tokovima podataka (streams).
Postoje 2 vrste podataka:
-znakovi characters 16 bitova mogu podravati razliite tipove
znakova (Unicode)
-bajtovi bytes 8 bitova podravaju samo ISO-Latin-1 8-bit
Temeljem spomenutih vrsta podataka postoje 2 grupe tokova podataka:
-tokovi znakova prema operacijama u nazivu imaju Reader i Writer
-tokovi bajtova prema operacijama u nazivu imaju Input i Output.

Napredne Web tehnologije i servisi - FOI


3

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Character Streams (16 bita)

Napredne Web tehnologije i servisi - FOI


4

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Byte Streams (8 bita)

Napredne Web tehnologije i servisi - FOI


5

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Koritenje tokova
Vrsta U/I
Memorija

Cijev
Datoteka

Znakovni

Bajtni

CharArrayReader
CharArrayWriter
StringReader
StringWriter
PipedReader
PipedWriter
FileReader
FileWriter

ByteArrayInputStream
ByteArrayOutputStream
StringBufferInputStream

Dodavanje
Serializacija objekta
Konverzija podataka
Brojanje

LineNumberReader

PipedInputStream
PipedOutputStream
FileInputStream
FileOutputStream
SequenceInputStream
ObjectInputStream
ObjectOutputStream
DataInputStream
DataOutputStream
LineNumberInputStream

Napredne Web tehnologije i servisi - FOI


6

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Koritenje tokova - nastavak


Vrsta U/I
Pogled unaprijed
Ispis
Datoteka
Meuspremanje
Filtriranje
Konverzija izmeu
bajtova i znakova

Znakovni

Bajtni

PushbackReader
PrintWriter
FileReader
FileWriter
BufferedReader
BufferedWriter
FilterReader
FilterWriter
InputStreamReader

PushbackInputStream
PrintStream
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOutputStream
FilterInputStream
FilterOutputStream
OutputStreamWriter

Napredne Web tehnologije i servisi - FOI


7

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

itanje i pisanje u datoteku


import java.io.*;
public class KopirajDatoteku {
public static void main(String[] args) throws IOException {
File inputFile = new File(args[0]);
File outputFile = new File(args[1]);
FileInputStream in = new FileInputStream(inputFile);
FileOutputStream out = new FileOutputStream(outputFile);
int c;
while ((c = in.read()) != -1)
out.write(c);
in.close();
out.close();
}
}

java Primjer32 postupak.txt a.txt


Primjer32 itanje i pisanje u datoteku
Napredne Web tehnologije i servisi - FOI
8

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Pisanje u formatiranu datoteku


import java.io.*;
public class Primjer32_0 {
public static void main(String[] args) throws IOException {
FileWriter out = new FileWriter(args[0]);
int broj = (new Integer(args[1])).intValue();
double korijen;
long kvadrat;
for (int i = 0; i < broj; i ++) {
korijen = Math.sqrt((double) i);
kvadrat = (long) i * i;
out.write(String.format("%4d %6d %10.5f\n", i, kvadrat, korijen));
}
out.close();
}
}

Napredne Web tehnologije i servisi - FOI


9

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Pisanje u formatiranu datoteku


java Primjer32_0 b.txt 20
notepad b.txt

Primjer32_0 Pisanje u strukturiranu datoteku


Napredne Web tehnologije i servisi - FOI
10

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Pisanje u strukturiranu datoteku


import java.io.*;
public class Primjer32_1 {
public static void main(String[] args) throws IOException {
DataOutputStream out = new DataOutputStream(new
FileOutputStream(args[0]));
int broj = (new Integer(args[1])).intValue();
double korijen;
long kvadrat;
for (int i = 0; i < broj; i ++) {
korijen = Math.sqrt((double) i);
kvadrat = (long) i * i;
out.writeInt(i);
out.writeChar('\t');
out.writeDouble(korijen);
out.writeChar('\t');
out.writeLong(kvadrat);
out.writeChar('\n');
}
out.close();
}
}

Napredne Web tehnologije i servisi - FOI


11

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Pisanje u strukturiranu datoteku


java Primjer32_1 c.txt 20
notepad c.txt

Primjer32_1 Pisanje u strukturiranu datoteku


Napredne Web tehnologije i servisi - FOI
12

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

itanje strukturirane datoteke


import java.io.*;
public class Primjer32_2 {
public static void main(String[] args) throws IOException {
int broj;
double korijen;
long kvadrat;
DataInputStream in = new DataInputStream(new
FileInputStream(args[0]));
try {
while (true) {
broj = in.readInt();
in.readChar();
// tab
korijen = in.readDouble();
in.readChar();
// tab
kvadrat = in.readLong();
in.readChar();
// eol
System.out.println(broj + "\t" + korijen + "\t" + kvadrat +
"\n");
}

Napredne Web tehnologije i servisi - FOI


13

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

itanje strukturirane datoteke - nastavak


} catch (EOFException e)
{
System.out.println("Gotovo!");
}
in.close();
}
}

java Primjer32_2 c.txt

Primjer32_2 itanje strukturirane datoteke


Napredne Web tehnologije i servisi - FOI
14

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Nove osobine u Java 7


Dodani su paketi java.nio.file i java.nio.file.attribute koji
sadre klase putem kojih se moe dodatno koristiti datoteni ulaz/izlaz i
pristupiti datotenom sustavu.
Posebna je novost uvoenje klase Path iji objekt kod datoteke predstavlja
njen naziv i putanju u datotenom sustavu
Vie na http://docs.oracle.com/javase/tutorial/essential/io/fileio.html

Napredne Web tehnologije i servisi - FOI


15

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Serijalizacija
Zapis objekta na nain da kasnije moe biti rekonstruiran kod itanja.
Serijalizacije se koristi kod:
-RMI za komunikaciju objekata preko socket-a
-lagane perzistentnosti arhiviranje objekta za koritenje u
kasnijem pozivanju istog programa.
Klasa iji objekti trebaju podravati serijalizaciju treba implementirati
suelje Serializable.
http://docs.oracle.com/javase/7/docs/api/java/io/Serializable.html

Napredne Web tehnologije i servisi - FOI


16

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Serijalizacija - izlaz
import java.io.*;
public class Primjer32_3 {
public static void main(String[] args) throws IOException {
FileOutputStream out = new FileOutputStream(args[0]);
ObjectOutputStream s = new ObjectOutputStream(out);
s.writeObject(args[0]);
s.writeObject(new java.util.Date());
s.close();
}
}

java Primjer32_3 d.txt


notepad d.txt

Primjer32_3 Serijalizacija - izlaz


Napredne Web tehnologije i servisi - FOI
17

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Serijalizacija - ulaz
import java.io.*;
public class Primjer32_4 {
public static void main(String[] args) throws Exception {
FileInputStream in = new FileInputStream(args[0]);
ObjectInputStream s = new ObjectInputStream(in);
String datoteka = (String) s.readObject();
java.util.Date datum = (java.util.Date) s.readObject();
s.close();
System.out.println("Naziv: " + datoteka);
System.out.println("Datum: " + datum);
}
}

java Primjer32_4 d.txt

Primjer32_4 Serijalizacija - ulaz


Napredne Web tehnologije i servisi - FOI
18

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Vlastita klasa za serijalizaciju


import java.io.*;
public class Podaci implements Serializable {
String datoteka;
java.util.Date datum;
Podaci(String a_datoteka, java.util.Date a_datum)
{
datoteka = a_datoteka;
datum = a_datum;
}
}

Podaci Podaci za serijalizaciju


Napredne Web tehnologije i servisi - FOI
19

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Serijalizacija objekta - izlaz


import java.io.*;
public class Primjer32_5 implements Serializable {
public static void main(String[] args) throws IOException {
Podaci mojiPodaci = new Podaci(args[0], new java.util.Date());
FileOutputStream out = new FileOutputStream(args[0]);
ObjectOutputStream s = new ObjectOutputStream(out);
s.writeObject(mojiPodaci);
s.close();
}
}

java Primjer32_5 e.txt


notepad e.txt

Primjer32_5 Serijalizacija objekta - izlaz


Napredne Web tehnologije i servisi - FOI
20

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Serijalizacija objekta - ulaz


import java.io.*;
public class Primjer32_6 {
public static void main(String[] args) throws Exception {
FileInputStream in = new FileInputStream(args[0]);
ObjectInputStream s = new ObjectInputStream(in);
Podaci mojiPodaci = (Podaci) s.readObject();
s.close();
System.out.println("Naziv: " + mojiPodaci.datoteka);
System.out.println("Datum: " + mojiPodaci.datum);
}
}

java Primjer32_6 d.txt

Primjer32_6 Serijalizacija objekta - ulaz


Napredne Web tehnologije i servisi - FOI
21

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Programiranje mrenih resursa


Java je dizajnirana da bude koritena u mrenom okruenju.
Postoji veliki broj klasa i suelja koje provode operacije u tom prirodnom
okruenju Jave.
Podaci se prenose na Internetu u paketima fiksne duljine pod nazivom
datagrams. Svaki datagram sadri zaglavlje (header) i tijelo (payload).
Zaglavlje sadri adresu i port primatelja, adresu i port poiljatelja, i druge
"kuanske" podatke koji se koriste za osiguranje pouzdanog prijenosa. Tijelo
sadri same podatke.
Zbog fiksne veliine datagrama obino je potrebno podijeliti podatke u vie
paketa te ih sastaviti na odreditu. Pri tome postoji mogunost gubitka ili
promjene u paketu tijekom prijenosa zbog ega treba zahtjevati ponovno slanje.
To moe biti sloen posao s puno programskog koda.

Napredne Web tehnologije i servisi - FOI


22

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Socket
Posao oko prijenosa podataka danas je puno jednostavniji zbog primjene
socketa, inovacije iz Berkley Unix-a.
Socket omoguava programerima da tretiraju mrenu vezu kao tok podataka
(stream) u koji se mogu pisati bajtovi i iz kojeg itati bajtovi.
Ta apstrakcija oslobaa programera od rada na niskoj razini.
Socket je veza izmeu dva raunala, a moe obaviti sedam osnovnih operacija:
-uspostaviti vezu s udaljenim raunalom
-slati podatke
-primati podatke
-zatvoriti vezu
-povezati se na port
-prislukivati dolazee podatke
-primiti veze s udaljenih raunala na povezanom portu.
Napredne Web tehnologije i servisi - FOI
23

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Socket
Postoje dvije vrste socketa u odnosu na njihovu funkciju:
-klijent
- Socket
-posluitelj - ServerSocket

java.lang.Object
|
+-java.net.Socket

java.lang.Object
|
+-java.net.ServerSocket

Napredne Web tehnologije i servisi - FOI


24

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Utvrivanje naziva lokalnog raunala


import java.net.*;
public class Primjer33 {
public static void main (String args[]) {
try {
InetAddress address = InetAddress.getLocalHost();
System.out.println(address);
}
catch (UnknownHostException e) {
e.printStackTrace();
}
}
}

Primjer33 Utvrivanje naziva lokalnog raunala


Napredne Web tehnologije i servisi - FOI
25

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Utvrivanje naziva lokalnog raunala


> java Primjer33
nbkermek3/192.168.0.100

Napredne Web tehnologije i servisi - FOI


26

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Utvrivanje svih naziva/adresa nekog raunala


import java.net.*;
public class Primjer33_1 {
public static void main (String args[]) {
try {
InetAddress[] addresses = InetAddress.getAllByName(args[0]);
for (int i = 0; i < addresses.length; i++) {
System.out.println(addresses[i]);
}
}
catch (UnknownHostException e) {
e.printStackTrace();
}
}
}

Primjer33_1 Utvrivanje svih naziva nekog raunala


Napredne Web tehnologije i servisi - FOI
27

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Utvrivanje svih naziva/adresa nekog raunala


> java Primjer33_1 www.cnn.com
www.cnn.com/157.166.224.25
www.cnn.com/157.166.224.26
www.cnn.com/157.166.226.25
www.cnn.com/157.166.226.26
www.cnn.com/157.166.255.18
www.cnn.com/157.166.255.19

Napredne Web tehnologije i servisi - FOI


28

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

itanje podataka s adrese


import java.net.*;
import java.io.*;
public class Primjer33_2 {
public static void main (String args[]) {
try {
URL u = new URL(args[0]);
InputStream in = u.openStream();
in = new BufferedInputStream(in);
Reader r = new InputStreamReader(in);
int c;
while ((c = r.read()) != -1) {
System.out.print((char) c);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

Primjer33_2 itanje podataka s adrese


Napredne Web tehnologije i servisi - FOI
29

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

itanje podataka s adrese


Ukoliko URL nije ispravno upisan (npr. nema protokola) javlja se pogreka
> java Primjer33_2 www.cnn.com
java.net.MalformedURLException: no protocol: www.cnn.com
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at java.net.URL.<init>(Unknown Source)
at Primjer33_2.main(Primjer33_2.java:9)

Napredne Web tehnologije i servisi - FOI


30

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

itanje podataka s adrese


> java Primjer33_2 http://arka.foi.hr
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-2">
<title>start.htm</title>
</head><body style="color: rgb(0, 0, 0);" link="#0000ee" alink="#0000ee"
vlink="
#551a8b">
<div style="text-align: center; color: rgb(0, 0, 153); background-color:
rgb(255
, 255, 255);"><big style="font-family: helvetica,arial,sansserif;"><big><big><br>
<br>
Dobrodo&#353;li !</big></big></big><br>
<br>
...
</div>
</body></html>

Napredne Web tehnologije i servisi - FOI


31

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Ispitivanje portova na hostu pomou socketa


import java.net.*;
import java.io.*;
public class Primjer33_3 {
public static void main(String args[]) {
String host = args[0];
for (int i = Integer.parseInt(args[1]); i < Integer.parseInt(args[2]);
i++) {
try {
Socket s = new Socket(host, i);
System.out.println(
"Port: " + i + " OK");
}
catch (UnknownHostException e) {
e.printStackTrace();
}
catch (IOException e) {
}
}
}
}

Primjer33_3 Ispitivanje portova za hostu pomou socketa


Napredne Web tehnologije i servisi - FOI

32

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Ispitivanje portova na hostu pomou socketa


> java Primjer33_3 localhost 80 81
Port: 80 OK

Tzv. skeniranje portova nije ba omiljena akcija kod administratora sustava!

Napredne Web tehnologije i servisi - FOI


33

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Uspostavljenje veze s hostom na portu 80


import java.net.*;
import java.io.*;
public class Primjer33_4 {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
try {
Socket theSocket = new Socket(args[i], 80);
System.out.println("Uspostavljena veza " + theSocket.getInetAddress()
+ " na portu " + theSocket.getPort() + " s porta "
+ theSocket.getLocalPort() + " od " + theSocket.getLocalAddress());
}
catch (UnknownHostException e) {
System.err.println("Nepoznat: " + args[i]);
}
catch (SocketException e) {
System.err.println("Veza nije uspostavljena: " + args[i]);
}
catch (IOException e) {
System.err.println(e);
}
} } }

Napredne Web tehnologije i servisi - FOI


34

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Uspostavljenje veze s hostom na portu 80 nastavak

Primjer33_4 Uspostavljenje veze s hostom na portu 80


Napredne Web tehnologije i servisi - FOI
35

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Uspostavljenje veze s hostom na portu 80 nastavak


> java Primjer33_4 localhost
Uspostavljena veza localhost/127.0.0.1 na portu 80 s porta 3580 od /127.0.0.1

Napredne Web tehnologije i servisi - FOI


36

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Testiranje klijenata
...
try {
ServerSocket server = new ServerSocket(port, 1);
System.out.println("Listening for connections on port "
+ server.getLocalPort());
while (true) {
Socket connection = server.accept();
try {
System.out.println("Connection established with "
+ connection);
Thread input = new InputThread(connection.getInputStream());
input.start();
Thread output
= new OutputThread(connection.getOutputStream());
output.start();
...

ClientTester Testiranje klijenata


Napredne Web tehnologije i servisi - FOI
37

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Testiranje klijenata
Ukoliko je port zauzet od drugog programa javlja se pogreka
> java ClientTester 80
java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at ClientTester.main(ClientTester.java:19)

Napredne Web tehnologije i servisi - FOI


38

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Testiranje klijenata
> java ClientTester 8080
Listening for connections on port 8080
(SLIJEDI OTVARANJE ADRESE http://localhost:8080/ U PREGLEDNIKU)
Connection established with Socket[addr=/127.0.0.1,port=3581,localport=8080]
GET / HTTP/1.1
Host: localhost:8080
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7)
Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

Napredne Web tehnologije i servisi - FOI


39

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Mali httpd posluitelj


//file: TinyHttpd.java
import java.net.*;
import java.io.*;
import java.util.*;
public class TinyHttpd {
public static void main( String argv[] ) throws IOException {
ServerSocket ss =
new ServerSocket( Integer.parseInt(argv[0]) );
while ( true )
new TinyHttpdConnection( ss.accept() ).start();
}
} // end of class TinyHttpd

Napredne Web tehnologije i servisi - FOI


40

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Mali httpd posluitelj


class TinyHttpdConnection extends Thread {
Socket client;
TinyHttpdConnection ( Socket client ) throws SocketException {
this.client = client;
setPriority( NORM_PRIORITY - 1 );
}
public void run( ) {
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream(), "8859_1" ));
OutputStream out = client.getOutputStream( );
PrintWriter pout = new PrintWriter(
new OutputStreamWriter(out, "8859_1"), true );
String request = in.readLine( );
System.out.println( "Request: + request );

Napredne Web tehnologije i servisi - FOI


41

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Mali httpd posluitelj

StringTokenizer st = new StringTokenizer( request );


if ((st.countTokens() >= 2) && st.nextToken().equals("GET") ) {
if ( (request = st.nextToken()).startsWith("/") )
request = request.substring( 1 );
if ( request.endsWith("/") || request.equals("") )
request = request + "index.html";
try {
FileInputStream fis = new FileInputStream(request);
byte [] data = new byte [ fis.available( ) ];
fis.read( data );
out.write( data );
out.flush( );
} catch ( FileNotFoundException e ) {
pout.println( "404 Object Not Found" );
}
} else
pout.println( "400 Bad Request" );
client.close();
} catch ( IOException e ) {
System.out.println( "I/O error " + e );
}}

Napredne Web tehnologije i servisi - FOI


42

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Mali httpd posluitelj

TinyHttpd Mali httpd posluitelj


Napredne Web tehnologije i servisi - FOI
43

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

Mali httpd posluitelj


> java TinyHttpd 8080
(SLIJEDI
Request:
Request:
Request:

OTVARANJE ADRESE http://localhost:8080/Primjer33.java


GET /Primjer33.java HTTP/1.1
GET /favicon.ico HTTP/1.1
GET /favicon.ico HTTP/1.1

Napredne Web tehnologije i servisi - FOI


44

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

U PREGLEDNIKU)

Literatura
http://download.oracle.com/javase/tutorial/essential/io/index.html
http://download.oracle.com/javase/tutorial/networking/index.html

Napredne Web tehnologije i servisi - FOI


45

Dr.sc. D.Kermek, Fakultet organizacije i informatike, Varadin

You might also like