Forma Za Pisanje Zahtjeva - PowerPoint by tfk18369

VIEWS: 1,102 PAGES: 30

More Info
									PROGRAMSKI JEZIK JAVA
  Mrežno programiranje u Javi
  Osnovne odrednice

• mrežno programiranje – pisanje
  programa koji komuniciraju preko
  računarske mreže
• oslanja se na IP mrežni protokol
• mogudnost korišdenja TCP i UDP
  protokola
• komunikacija se odvija kroz stream-ove
  (stream za čitanje i stream za pisanje);
  jednako kao i sa fajlovima u okviru fajl-
  sistema; dvosmjerna komunikacija
• paket java.net
              Elemeni klijent-server arhitekture

     Klijent, server, mreža


    Klijent
                                                Server
                               Mreža



klijent
                                       server
   Pojam Socket-a
• pojam socket-a: uređeni par (IP adresa, port)
  jednog učesnika u komunikaciji
• uspostavljena veza između dva programa – skup
  od dva socket-a


   program A                      program B


(81.92.25.123,                 (147.91.177.196,
7890)                          2450)
    Pojam Socket-a
    • veza između 2 programa, ne 2 računara

čvor X (81.92.25.123)               čvor Y
                                    (147.91.177.196)
                   7890      2450
    program A                          program B
               3652          5489
                             6255      program C


čvor Z (215.23.5.12)
                   2223
    program D
   IP adresa

• identifikator čvora u IP mreži je IP adresa
• IPv4 – 32-bitni broj – 4 grupe po 8 bita
• radi lakšeg pamdenja – 4 decimalno zapisana
  okteta, npr. 147.91.197.2
• pomodu simboličke adrese, npr. www.etfbl.net
• klasa InetAddress predstavlja adresu čvora u mreži
   – InetAddress a = InetAddress.getByName(“www.etfbl.net”);
   – InetAddress b = InetAddress.getByName(“147.91.197.2”);
   – InetAddress c = InetAddress.getLocalHost();
• IPv6 – 128-bitni
   – Otklanja nedostatke IPv4:
      • Ograničen adresni prostor
      • Sigurnost
  Klasa Socket

• objekti Socket klase predstavljaju uspostavljene
  TCP konekcije
• otvaranje konekcije:
   – Socket s = new Socket(addr, 80);//addr-InetAddress
   – Socket s = new Socket(“www.etfbl.net”, 80);
• metoda getInputStream()
• metoda getOutputStream()
  Klasa ServerSocket
• predstavlja serverski socket
• metoda accept() blokira izvršenje sve dok
  neki klijent ne uspostavi vezu; tada vrada
  konstruisan Socket objekat preko koga se
  komunicira sa klijentom
• kreiranje objekata klase ServerSocket:
   – ServerSocket ss = new ServerSocket(2345);
• osluškivanje:
   – ss.accept();
Tipičan tok komunikacije – server strana
         // čekam klijenta...
         ServerSocket ss = new ServerSocket(port);
         Socket s = ss.accept();

         // inicijalizacija
         BufferedReader in = new BufferedReader(...,s);
         PrintWriter out = new PrintWriter(...,s);

         // komunikacija
         String request = in.readLine();   // čitam zahtjev
         out.println(“odgovor”);           // šaljem odgovor

         // prekid veze
         in.close();
         out.close();
         s.close();
Tipičan tok komunikacije – klijent strana
             // inicijalizacija
             Socket s = new Socket(addr, port);
             BufferedReader in = new BufferedReader(...,s);
             PrintWriter out = new PrintWriter(...,s);

             // komunikacija
             out.println(“zahtjev”);          // šaljem zahtjev
             String response = in.readLine(); // čitam odgovor

             // prekid veze
             in.close();
             out.close();
             s.close();
                      Tipičan tok komunikacije
              klijent                                           server
                                                  ServerSocket ss = new ServerSocket(port)

                                     TCP 3-way Handshake
Socket s = new Socket(addr, port);                          Socket s = ss.accept();

šalje zahtjev koristeći s
                                                           prihvata zahtjev koristeći s

                                                            šalje odgovor koristeći s

prihvata odgovor koristeći s


zatvara s                                                         zatvara s
Server koji opslužuje više klijenata
       // beskonačna petlja
       while (true)
         server “sluša”
         prihvata konekciju
         kreira nit za komunikaciju sa
         klijentom
       end while
Server koji opslužuje više klijenata

    Klijent 1                      Server

                                    Server
                                   Threads
                      Mreža


       Klijent 2
Server koji opslužuje više klijenata
         // Serverska petlja
         ServerSocket ss = new ServerSocket(port);
         while (true) {
           Socket s = ss.accept();
           ServerThread st = new ServerThread(s);
         }

         // poseban thread – obrada pojedinačnog
            //zahtjeva
         class ServerThread extends Thread {
           public void run() {
             // inicijalizacija
             // komunikacija
             // prekid veze
           }
         }
                  Java Socket-i
           ServerSocket(1234)
Server




         Output/write stream                                       Klijent



         Input/read stream

                                    Socket(“147.91.197.2”, 1234)

                                “www.etfbl.net”
  Primjer – Mini server

• Klijent:
   1. Uspostavlja vezu sa serverom.
   2. Šalje zahtjev serveru (tekst “HELLO”).
   3. Čita odgovor servera.
   4. Ispisuje odgovor na konzolu.
   5. Završava komunikaciju.
• Server:
   1. Čeka klijente u beskonačnoj petlji.
   2. Za svakog klijenta koji je uspostavio vezu pokrede
      posebnu nit koja radi sljedede:
   a. Čita zahtjev klijenta (tekst “HELLO”).
   b. Šalje odgovor – redni broj obrađenog zahteva.
 Klasa Client
import java.io.*;
import java.net.*;
public class Client {
public static final int TCP_PORT = 9000;
public static void main(String[] args) {
try {
// odredi adresu racunara sa kojim se povezujemo
// (povezujemo se sa nasim racunarom)
InetAddress addr = InetAddress.getByName("127.0.0.1");
// otvori socket prema drugom racunaru
Socket sock = new Socket(addr, TCP_PORT);
// inicijalizuj ulazni stream
BufferedReader in = new BufferedReader(new
   InputStreamReader(
sock.getInputStream()));
// inicijalizuj izlazni stream
PrintWriter out = new PrintWriter(
new BufferedWriter( new OutputStreamWriter(
sock.getOutputStream())), true);
   Klasa Client (2)
System.out.println("[Client]: HELLO");
out.println("HELLO");
// procitaj odgovor
String response = in.readLine();
System.out.println("[Server]: " + response);
// zatvori konekciju
in.close();
out.close();
sock.close();
} catch (UnknownHostException e1) {
e1.printStackTrace();
} catch (IOException e2) {
e2.printStackTrace();
}
}
}
Klasa Server
import java.io.*;
import java.net.*;
public class Server {
public static final int TCP_PORT = 9000;
public static void main(String[] args) {
try {
int clientCounter = 0;
// slušaj zahteve na datom portu
ServerSocket ss = new ServerSocket(TCP_PORT);
System.out.println("Server running...");
while (true) {
Socket sock = ss.accept();
System.out.println("Client accepted: " +
(++clientCounter));
ServerThread st = new ServerThread(sock, clientCounter);
}
} catch (Exception ex) {
ex.printStackTrace();
}}}
  Klasa ServerThread
import java.io.*;
import java.net.*;
public class ServerThread extends Thread {
public ServerThread(Socket sock, int value) {
this.sock = sock;
this.value = value;
try {
// inicijalizuj ulazni stream
in = new BufferedReader(
new InputStreamReader(
sock.getInputStream()));
// inicijalizuj izlazni stream
out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
sock.getOutputStream())), true);
} catch (Exception ex) {
ex.printStackTrace();
}
start();
}
  Klasa ServerThread (2)
public void run() {
try {
// procitaj zahtjev
String request = in.readLine();
// odgovori na zahtjev
out.println("(" + value + ")");
// zatvori konekciju
in.close();
out.close();
sock.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
private Socket sock;
private int value;
private BufferedReader in;
private PrintWriter out;
}
  Zadatak za domadi rad
Klijent i server za listanje sadržaja direktorijuma

Napisati klijent/server aplikaciju koja omogudava listanje sadržaja
   direktorijuma sa servera na klijentu. Na klijentov zahtjev koji
   sadrži putanju direktorijuma na serveru koga treba izlistati,
   server formira spisak i vrada ga klijentu kao odgovor. Klijent i
   server nemaju potrebe za GUI interfejsom.
Komentar: Jasno je da de klijent i server izgledati slično klijentu i
   serveru koji su prikazani u prethodnom primjeru. Ono što je
   neophodno uraditi prvo, je definisati protokol komunikacije
   klijenta i servera, prije svega format poruka koje se šalju tokom
   komunikacije. Za listanje sadržaja direktorijuma treba pogledati
   kako se koristi klasa java.io.File i njene metode exists, isDirectory
   i list. Odgovor servera bi trebalo da na odgovarajudi način
   reaguje na situacije kada traženi direktorijum ne postoji, ili kada
   je u pitanju fajl, a ne direktorijum.
PROGRAMSKI JEZIK JAVA
 Chat aplikacija
Zadatak
Napisati klijent/server GUI aplikaciju koja omogudava chat
  za sve korisnike koji se prijave na isti server. Zadatak
  klijenta je da omogudi unos novih i pregled pristiglih
  poruka (sa podacima o pošiljaocu poruke). Zadatak
  servera je da poruke poslate od strane jednog klijenta
  proslijedi do ostalih klijenata (ne i pošiljaocu). Svaki
  korisnik u sistemu je jednoznačno određen svojim
  korisničkim imenom (username) koga bira prilikom
  prijavljivanja na sistem. Odmah nakon pokretanja
  klijenta korisnik mora da se prijavi na željeni server
  (određen svojom simboličkom ili numeričkom
  adresom) pod određenim korisničkim imenom.
Uvodna razmatranja
Potrebno je realizovati klijent/server sistem gdje server mora da
   opslužuje više korisnika istovremeno. Na prvi pogled, sistem
   liči na prethodni primjer, ali je nešto složeniji. Njegove
   osnovne osobine su sljedede:

    • Klijent može da šalje poruke serveru, što se inicira akcijom
       nad korisničkim interfejsom.
    • Klijent može da prima poruke od servera u proizvoljnom
       vremenskom trenutku, što je posljedica slanja poruke od
       strane nekog drugog klijenta.

    • Server može da prima poruke od strane više klijenata
       istovremeno, i to u slučajnim vremenskim trenucima.
    • Server mora da proslijedi poruku jednog klijenta svim
       ostalim klijentima.
  Funkcije klijenta
• Prijava korisnika, tj. prozor za unos korisničkog
  imena i adrese (imena) servera
• Pristiglu poruku mora prikazati u odgovarajudoj
  komponenti korisničkog interfejsa
• Poruka može stidi u bilo kom trenutku, što znači
  da klijent mora neprestano osluškivati da li
  server šalje poruku – čitačka nit
• Poruka se šalje akcijom nad korisničkim
  interfejsom (npr. Klik na dugme pošalji)
Klijent
• Jednostavna varijanta – 4 klase:
   – Client – osnovna klasa, prikazuje Login dijalog,
     konekcija na server, ako je uspješna prikazuje
     se glavna forma (MainFrame) i kreira se čitačka
     nit. Ukoliko je neuspješna konekcija, prikazati
     poruku o grešci
   – LoginDialog – prozor za logovanje
   – MainFrame
   – ReaderThread – “čita” poruke iz mrežne
     konekcije i prikazuje ih u odgovarajućoj
     komponenti
 Server
• Jednostavna varijanta – 2 klase:
   – Server – osnovna klasa, očekuje
     konekcije klijenata, vrši provjeru
     korisničkog imena, dodaje prijavljenog
     korisnika u listu korisnika o kreira
     čitačku nit
   – ReaderThread – “čita” poruke iz
     mrežne konekcije (koje stižu od
     klijenta), prosljeđuje ih ostalim,
     odjavljene korisnike uklanja iz liste
     korisnika
  Protokol
• Server osluškuje u beskonačnoj petlji
• Klijent šalje korisničko ime
• Server provjerava da li korisnik postoji i šalje
  odgovarajudi odgovor
• Klijent prihvata odgovor
• Ako je odgovor negativan zatvara se konekcija (ako je
  neko ulogovan ved pod istim imenom)
• Ako je pozitivan, klijent kreira glavni prozor i čitačku
  nit
• Korisnik unosi poruku u odgovarajude polje i inicira
  slanje ostalim korisnicima
• Klijentska aplikacija šalje poruku sa podacima o
  pošiljaocu u formatu [username]+poruka
  Protokol (2)
• Server prihvata poruku
• Server prosljeđuje poruku ostalim klijentima
• Ako korisnik zatvara klijentsku aplikaciju serverskoj
  aplikaciji se šalje poruka end
• Kad serverska aplikacija prihvati end poruku, vrada
  klijentskoj aplikaciji end poruku i uklanja korisnika iz
  liste aktivnih klijenata
• Kad klijent prihvati end poruku zatvara aplikaciju

								
To top