Click here to load reader
View
235
Download
2
Embed Size (px)
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