Click here to load reader

Objektno orjentirano programiranje - . semestar/Objektno... · PDF fileObjektno orjentirano programiranje Predavanje 11 Objekti i klijent server aplikacije, templates, klasifikacija

  • View
    235

  • Download
    2

Embed Size (px)

Text of Objektno orjentirano programiranje - . semestar/Objektno... · PDF fileObjektno...

  • Objektno orjentirano programiranje

    Predavanje 11

    Objekti i klijent server aplikacije, templates, klasifikacija

  • Klijent - server

    Kao i u prethodnom predavanju radi se o slanju objekta kroz mreu

    Kod distribuiranog objektnog modela mogu se koristiti vlasniki (eng. proprietary) pristup ili nevlasniki pristup koritenjem SOAP/XML

    Isto vrijedi i za klijent server model

    Pristup koji emo koristiti ovisi o samom problemu i postavljenim zahtjevima

    Vlasniki pristup je jednostavniji i uzima manje vremena ali nas ograniava na jednu tehnologiju

    Nevlasniki pristup omoguava komunikaciju neovisnu o platformi i programskom jeziku

  • U ovom primjeru koristi se Java programski jezik

    Klijent stvara objekt i alje ga na server

    Server stvara referencu objekta da bi mu pristupio

    Server moe mijenjati atribute objekta i vratiti ga natrag klijentu

    Vlasniki pristup

    Klijent Server

    Objekt

  • Primjer

    Stvorimo klasu TekstualnaPorukasa atributima ime i poruka

    import java.io.*;import java.util.*;public class TekstualnaPoruka implements Serializable {

    public String ime;public String poruka;//KonstruktorTekstualnaPoruka(String i) {

    poruka = ;ime= i;

    }// Pristupnikpublic String dohvatiIme() {

    return ime;}// Pristupnikpublic String dohvatiPoruku() {

    return poruka;}//Mutatorpublic void postaviPoruku(String p) {

    poruka = p;}

    }

  • Klijentski kod

    Klijent koristi klasu tekstualnaPoruka da bi stvorio objekt i poslao ga na server

    Klijent treba obaviti sljedee zadatke:

    Dohvatiti informacije od korisnika

    Stvoriti objekt

    Postaviti vrijednosti atributa

    Stvoriti socket konekciju

    Stvoriti izlazni tok (eng. stream)

    Zapisati objekt

    Zatvoriti tok

  • public class Klijent{

    public static void main(String[] arg) {

    try {

    String poruka= ;

    String ime= ;

    System.out.print(Unesite ime poruke:);

    ime = getString();

    // Stvori objekt

    TesktualanPoruka mojaPoruka= new TekstualnaPoruka(ime);

    System.out.print(Unesite sadrzaj poruke: );

    poruka= getString();

    // koristi mutator

    mojaPoruka.postaviPoruku(poruka);

    // Stvori konekciju na socketSocket socketNaServer = new Socket(127.0.0.1, 88888);// Stvori ObjectOutputStreamObjectOutputStream mojIzlazniStream =new ObjectOutputStream(socketNaServer .getOutputStream());// Zapii objekt u OutputStreammojIzlazniStream.writeObject(mojaPoruka);

    // Zatvori streammojIzlazniStream.close();

    } catch (Exception e) {System.out.println(e);}}

  • Serverski kod

    Server obavlja sljedee funkcionalnosti:

    Stvara referencu na objekt

    Slua na portu 88888

    eka konekciju klijenta

    Stvara input i output stream

    ita objekt TekstualnaPoruka

    Ispisuje poruku

  • public class Server {

    public static void main(String[] arg) {

    // Stvori referencu objekta kojeg oekuje

    TekstualnaPoruka mojaPoruka = null;

    try {

    // Sluaj na portu 88888

    ServerSocket mojServerSocket = new ServerSocket(88888);

    System.out.println(Spremno\n);

    // ekaj dok se klijent ne spoji

    Socket dolazni = mojServerSocket.accept();

    // Stvori input stream

    ObjectInputStream mojInputStream

    = new ObjectInputStream(dolazni.getInputStream());

    // Proitaj objekt sa streama

    mojaPoruka = (TekstualnaPoruka)mojInputStream.readObject();

    System.out.println(mojaPoruka.dohvatiIme() + :

    + mojaPoruka.dohvatiPoruku()+ \n);

    // Zatvori streammojInputStream.close();} catch(Exception e) {

    System.out.println(e);}

  • Nevlasniki pristup

    U nevlasnikom (eng. nonproprietary) pristupu obino se koristi XML kao to je to bio sluaj sa postojanim podacima i dstribuiranim sustavima

    Koritenjem XML-a moemo slati objekte izmeu aplikacija napisanih u razliitim programskim jezicima i meu razliitim platformama

    Iako su vlasniki i nevlasniki koncepti slini najvea razlika je u tome to objekti nisu rastavljeni u binarni zapis u vlasnikom formatu ve se koristi tekstualni XML dokument

  • XML pristup klijent server arhitekturi

    Nevlasniki pristup

    Klijent Server

    Objekt

    XML

  • Primjer

    Primjer klijent-server komunikacije realiziran u C#

    Nevlasniki pristup temeljen na XML-u

    XML definicija objekta je specificirana direktno u klasi

    Klasa se stvara oko XML definicija

  • namespace Server

    {

    [XmlRoot(racun)]

    public class BankovniRacun

    {

    private String strIme;

    private int intBrojRacuna;

    [XmlElement(ime)]

    public String Ime

    {

    get { return strIme; }

    set { strIme = value; }

    }

    [XmlElement(br_racuna)]

    public int BrojRacuna

    {

    get { return intBrojRacuna; }

    set { intBrojRacuna = value; }

    }

    public BankovniRacun()

    {

    this.Ime= Ivo Ivic;

    this.BrojRacuna= 76245;

    Console.WriteLine(Stvaranje rauna!);

    }

    }

    }

  • Klijentski kod

    Klijent izvodi sljedee zadatke:

    Stvara objekt BankovniRacun

    Stvara socket

    Priprema za formatiranje objekta u XML

    Stvara stream

    Serijalizira objekt u stream u XML formatu

    Zatvara resurse i stream

  • namespace Klijent

    {

    class Klijent

    {

    public static void Zapocni()

    {

    BankovniRacun mojRacun= new BankovniRacun();

    try

    {

    //Otvori TCP socket

    TcpClient tcpKlijent= new TcpClient(127.0.0.1, 88888);

    //Priprema za serijalizaciju objekta u XML

    XmlSerializer myXmlFactory =

    new XmlSerializer(typeof(BankovniRacun));

    //Stvori stream

    NetworkStream stream = tcpKlijent.GetStream();

    // Serijaliziraj objekt u TCP Stream

    myXmlFactory.Serialize(stream, mojRacun);

    // Zatvori stream

    stream.Close();

    tcpKlijent.Close();

    }

    catch (Exception ex)

    {

    Console.WriteLine(Exception: {0}, ex);

    }

    }

    }

    }

  • Serverski kod

    Stvori reference za objekt BankovniRacun

    Spoji se na socket i sluaj

    Postavi input stream

    itaj bajtove sa stream-a

    Deserijaliziraj objekt iz stream-a

    Zatvori sve resurse

  • public Server()

    {

    TcpListener server = null;

    TcpClient klijent= null;

    try

    {

    //Stvori Socket Listener i pokreni ga

    server = new TcpListener(IPAddress.Parse(127.0.0.1), 88888);

    server.Start();

    //Postavi input buffer

    Byte[] bajtovi = new Byte[256];

    //Otvori petlju za spajanje vie klijenata

    while (true)

    {

    //Zaponi primanje konekcija

    klijent= server.AcceptTcpClient();

    Console.WriteLine(Spojen!);

    //Otvori stream

    NetworkStream stream = klijent.GetStream();

    int i;

    while ((i = stream.Read(bajtovi, 0, bajtovi.Length)) != 0)

    {

    //Pripremi memory stream za serijalizaciju

    MemoryStream ms = new MemoryStream(bajtovi);

    //Pripremi alat za serijalizaciju

    XmlSerializer myXmlFactory =

    new XmlSerializer(typeof(CheckingAccount));

    //Stvori objekt BankovniRacun iz stream-a

    BankovniRacun mojRacun =

    (BankovniRacun)myXmlFactory.Deserialize(ms);

    //Ispii objekt

    Console.WriteLine(Ime: {0}, Broj rauna: {1}.,

    mojRacun.Ime, mojRacun.BrojRacuna);

  • Generiki tipovi (eng. generic types)

    U C++ koriste se templates

    Omoguava funkciji ili klasi da radi sa razliitim tipovima

    Funkciju/klasu ne moramo pisati vie puta za razliite tipove

    template

    void IspisiUdvostruceno(TYPE podaci)

    {

    cout

  • Generiki tipovi (eng. generic types)

    Prilikom poziva funkcije utvruje se o kojem se tipu radi

    npr. poziv: IspisiUdvostruceno() podrazumijeva int, a

    IspisiUdvostruceno(5.1) podrazumijeva double

    Moemo i eksplicitno navesti koji tip elimo prilikom poziva funkcije

    IspisiUdvostruceno (5);

  • Primjer

    template

    T Zbroji(T n1, T n2)

    {

    T rezultat;

    rezultat = n1 + n2;

    return rezultat;

    }

  • Primjer 2template

    double IzracunajProsjek(T tNiz[], int brElemenata)

    {

    T tSuma = T(); // tSuma = 0

    for (int i = 0; i < brElemenata; ++i)

    {

    tSuma += niz[i];

    }

    // O kojem god tipu T da se radi pretvori ga u double

    return double(tSum) / brElemenata;

    }

    int main()

    {

    int IntNiz[5] = {100, 200, 400, 500, 600};

    float FloatNiz[3] = { 1.22f, 2.33f, 14.54f};

    cout

  • Class templates - primjerclass MojaKlasa

    {

    int podaci;

    public:

    MojaKlasa() : podaci(0)

    {}

    void PostaviPodatke(int vrijednost)

    {

    podaci = vrijednost;

    }

    int DohvatiPodatke() const

    {

    return podaci;

    }

    void IspisiPodatke()

    {

    cout

  • template

    class MojaKlasa

    {

    T podaci;

    public:

    MojaKlasa() : podaci( T() )

    {}

    void PostaviPodatke(T vrijednost)

    {

    podaci= vrijednost;

    }

    T DohvatiPodatke() const

    {

    return podaci;

    }

    void IspisiPodatke()

    {

    cout

  • Viestruki tipovi - class templates

    template

    struct Par

    {

    Tip1 prvi;

    Tip2 drugi;

    };

    Par tocka1;

    tocka1.prvi = 5;

    tocka1.drugi = 40;

    Par tocka2;

    tocka2.prvi = 7;

    tocka2.drugi = 3.5412;

  • Dio 2. Klasifikacija

    Klasifikacija je nain organiziranja znanja

    U objektno orijentiranom programiranju svodi se na prepoznavanje jednakih znaajki meu

Search related