30
Mrežno računarstvo Mrežno računarstvo Soketi za servere Soketi za servere (iz glave 10) (iz glave 10)

Mrežno računarstvo

  • Upload
    herne

  • View
    56

  • Download
    1

Embed Size (px)

DESCRIPTION

Mrežno računarstvo. Soketi za servere (iz glave 10). Soketi za servere. klijenti – programi koji otvaraju soket do servera koji osluškuje konekcije klijentski soketi nisu dovoljni klijenti nemaju mnogo svrhe ako ne komuniciraju sa serverom a klasa Socket nije dovoljna za pisanje servera - PowerPoint PPT Presentation

Citation preview

Page 1: Mrežno računarstvo

Mrežno računarstvoMrežno računarstvo

Soketi za servereSoketi za servere

(iz glave 10)(iz glave 10)

Page 2: Mrežno računarstvo

Soketi za servereSoketi za servere

klijenti – programi koji otvaraju soket do servera koji klijenti – programi koji otvaraju soket do servera koji osluškuje konekcijeosluškuje konekcijeklijentski soketi nisu dovoljniklijentski soketi nisu dovoljniklijenti nemaju mnogo svrhe ako ne komuniciraju sa klijenti nemaju mnogo svrhe ako ne komuniciraju sa serveromserveroma klasa Socket nije dovoljna za pisanje serveraa klasa Socket nije dovoljna za pisanje serveraza kreiranje Socket-a mora se znati host sa kojim želimo za kreiranje Socket-a mora se znati host sa kojim želimo da se povežemoda se povežemokada pišemo server, ne znamo unapred ko će nas kada pišemo server, ne znamo unapred ko će nas kontaktirati, a čak i da znamo, ne znamo kada će to biti.kontaktirati, a čak i da znamo, ne znamo kada će to biti.drugim rečima, serveri su kao recepcionari koji sede kraj drugim rečima, serveri su kao recepcionari koji sede kraj telefona i čekaju dolazeće pozive. Oni ne znaju ko će telefona i čekaju dolazeće pozive. Oni ne znaju ko će zvati i kada, samo da kada telefon zazvoni, oni treba da zvati i kada, samo da kada telefon zazvoni, oni treba da se jave i pričaju ko god da je sa druge strane. Ovakvo se jave i pričaju ko god da je sa druge strane. Ovakvo ponašanje se ne može isprogramirati samom klasom ponašanje se ne može isprogramirati samom klasom Socket.Socket.

Page 3: Mrežno računarstvo

Za servere, koji prihvataju konekcije, Java obezbeđuje Za servere, koji prihvataju konekcije, Java obezbeđuje klasu ServerSocket koja predstavlja serverske sokete.klasu ServerSocket koja predstavlja serverske sokete.U suštini, posao serverskog soketa je da sedi kraj U suštini, posao serverskog soketa je da sedi kraj telefona i čeka dolazeće pozive.telefona i čeka dolazeće pozive.tj. serverski soket se izvršava na serveru i osluškuje tj. serverski soket se izvršava na serveru i osluškuje dolazeće TCP konekcije.dolazeće TCP konekcije.svaki serverski soket osluškuje na određenom portu svaki serverski soket osluškuje na određenom portu serverske mašine.serverske mašine.Kada klijent sa udaljenog hosta pokuša da se konektuje Kada klijent sa udaljenog hosta pokuša da se konektuje na taj port, server se budi, pregovara o konekciji između na taj port, server se budi, pregovara o konekciji između klijenta i servera i vraća regularni Socket objekat koji klijenta i servera i vraća regularni Socket objekat koji predstavlja soket između dva hosta.predstavlja soket između dva hosta.Drugim rečima, serverski soket čeka na konekcije, dok Drugim rečima, serverski soket čeka na konekcije, dok klijentski soketi iniciraju konekcije.klijentski soketi iniciraju konekcije.Nakon što je ServerSocket uspostavio konekciju, server Nakon što je ServerSocket uspostavio konekciju, server koristi regularni Socket objekat da šalje podatke klijentu. koristi regularni Socket objekat da šalje podatke klijentu. Podaci uvek putuju preko regularnog soketaPodaci uvek putuju preko regularnog soketa

Page 4: Mrežno računarstvo

klasa ServerSocketklasa ServerSocket

sadrži sve što je potrebno za pisanje sadrži sve što je potrebno za pisanje servera u Javiservera u Javi

ima konstruktore, metode koji osluškuju ima konstruktore, metode koji osluškuju konekcije na zadatom portu, metode za konekcije na zadatom portu, metode za konfigurisanje raznih opcija serverskog konfigurisanje raznih opcija serverskog soketa, i uobičajene razne metode kao što soketa, i uobičajene razne metode kao što je toString()je toString()

Page 5: Mrežno računarstvo

Životni ciklus serverskog programaŽivotni ciklus serverskog programa

kreira se novi ServerSocket na zadatom portu kreira se novi ServerSocket na zadatom portu korišćenjem konstruktorakorišćenjem konstruktoraServerSocket osluškuje dolazeće pokušaje konekcija na ServerSocket osluškuje dolazeće pokušaje konekcija na tom portu koristeći svoj accept() metod. Metod accept() tom portu koristeći svoj accept() metod. Metod accept() blokira dok klijent ne pokuša da napravi konekciju, kada blokira dok klijent ne pokuša da napravi konekciju, kada accept() vraća Socket objekat koji povezuje klijenta i accept() vraća Socket objekat koji povezuje klijenta i serveraserverau zavisnosti od tipa servera, getInputStream(), u zavisnosti od tipa servera, getInputStream(), getOutputStream() ili oba ova metoda se pozivaju za getOutputStream() ili oba ova metoda se pozivaju za Socket objekat kako bi se komuniciralo sa klijentomSocket objekat kako bi se komuniciralo sa klijentomserver i klijent interaguju u skladu sa dogovorenim server i klijent interaguju u skladu sa dogovorenim protokolom do zatvaranja konekcijeprotokolom do zatvaranja konekcijeserver, klijent, ili obojica zatvaraju konekcijuserver, klijent, ili obojica zatvaraju konekcijuserver se vraća na korak 2 i čeka narednu konekcijuserver se vraća na korak 2 i čeka narednu konekciju

Page 6: Mrežno računarstvo

ako korak 4 traje neograničeno, tradicionalni ako korak 4 traje neograničeno, tradicionalni Unix serveri kreiraju novi proces da rukuje Unix serveri kreiraju novi proces da rukuje svakom konekcijom tako da veći broj klijenata svakom konekcijom tako da veći broj klijenata može biti istovremeno usluženmože biti istovremeno usluženu tom slučaju, java programi kreiraju niti za u tom slučaju, java programi kreiraju niti za interakciju sa klijentima, tako da server može da interakciju sa klijentima, tako da server može da procesira narednu konekcijuprocesira narednu konekcijus druge strane, ako je protokol jednostavan i brz s druge strane, ako je protokol jednostavan i brz i dopušta da server zatvori konekciju kada i dopušta da server zatvori konekciju kada završi, efikasnije je da server neposredno završi, efikasnije je da server neposredno procesira zahtev klijenta, bez kreiranja nitiprocesira zahtev klijenta, bez kreiranja niti

Page 7: Mrežno računarstvo

I generisanje prevelikog broja niti može predstavljati I generisanje prevelikog broja niti može predstavljati problem. Za sistem sa oko 1GB RAM-a sve od približno problem. Za sistem sa oko 1GB RAM-a sve od približno 1000 niti će dramatično usporiti i izazvati da CPU često 1000 niti će dramatično usporiti i izazvati da CPU često swap-uje podatke u i iz RAM-a.swap-uje podatke u i iz RAM-a.Generisanje prevelikog broja niti je jedan od nekoliko Generisanje prevelikog broja niti je jedan od nekoliko načina da se pouzdano sruši java VMnačina da se pouzdano sruši java VMServerSocketChannel klasa obezbeđuje neblokirajući I/O ServerSocketChannel klasa obezbeđuje neblokirajući I/O zasnovan na kanalima, ne na tokovima. Sa kanalima, zasnovan na kanalima, ne na tokovima. Sa kanalima, jedna nit može procesirati veći broj konekcija. To je jedna nit može procesirati veći broj konekcija. To je prednost za velike servere. Za jednostavne servere, prednost za velike servere. Za jednostavne servere, manje opterećene, treba koristiti tehnike opisane u ovom manje opterećene, treba koristiti tehnike opisane u ovom (10.) poglavlju(10.) poglavlju

Page 8: Mrežno računarstvo

O.S. smešta dolazeće konekcije za određeni port u O.S. smešta dolazeće konekcije za određeni port u FIFO red.FIFO red.podrazumevana veličina je 50, ali može da varira od podrazumevana veličina je 50, ali može da varira od O.S. do O.S.O.S. do O.S.Neki O.S. imaju ovu dužinu 5 (onda je red vel. 5, ne 50)Neki O.S. imaju ovu dužinu 5 (onda je red vel. 5, ne 50)Nakon što se red napuni, hostovi odbijaju dodatne Nakon što se red napuni, hostovi odbijaju dodatne konekcije za taj port dok se ne oslobodi mesto u redukonekcije za taj port dok se ne oslobodi mesto u redumnogi (ali ne svi) klijenti pokušavaju nekoliko puta da mnogi (ali ne svi) klijenti pokušavaju nekoliko puta da naprave konekciju ako inicijalni pokušaj bude odbijennaprave konekciju ako inicijalni pokušaj bude odbijenOS rukuje dolazećim konekcijama i redom, mi o tome ne OS rukuje dolazećim konekcijama i redom, mi o tome ne moramo da brinemomoramo da brinemonekoliko ServerSocket konstruktora omogućuje promenu nekoliko ServerSocket konstruktora omogućuje promenu veličine ovog reda, ali nije moguće povećati red iznad veličine ovog reda, ali nije moguće povećati red iznad maksimuma koji podržava O.S.maksimuma koji podržava O.S.

Page 9: Mrežno računarstvo

KonstruktoriKonstruktori

public ServerSocket(int port) throws public ServerSocket(int port) throws BindException, IOExceptionBindException, IOException

public ServerSocket(int port, int queueLength) public ServerSocket(int port, int queueLength) throws BindException, IOExceptionthrows BindException, IOException

public ServerSocket(int port, int queueLength, public ServerSocket(int port, int queueLength, InetAddress bindAddress) throws IOExceptionInetAddress bindAddress) throws IOException

public ServerSocket() throws IOExceptionpublic ServerSocket() throws IOException

zadaje se port, dužina reda, local network zadaje se port, dužina reda, local network interface za koji treba da se vežeinterface za koji treba da se veže

Page 10: Mrežno računarstvo

public ServerSocket(int port) throws public ServerSocket(int port) throws BindException, IOExceptionBindException, IOException

kreira serverski soket na portu zadatom kreira serverski soket na portu zadatom argumentomargumentomako se prosledi 0 kao argument, sistem bira ako se prosledi 0 kao argument, sistem bira dostupan port za nasdostupan port za nasport koji izabere sistem, ponekad se naziva port koji izabere sistem, ponekad se naziva anonimnim jer ne znamo njegov brojanonimnim jer ne znamo njegov brojza servere, anonimni portovi nisu od koristi, jer za servere, anonimni portovi nisu od koristi, jer klijenti moraju unapred da znaju na koji port da klijenti moraju unapred da znaju na koji port da se konektuju, međutim, ima nekoliko situacija se konektuju, međutim, ima nekoliko situacija kada anonimni port može biti koristankada anonimni port može biti koristan

Page 11: Mrežno računarstvo

primerprimer

kreiranje serverskog soketa koji će koristiti HTTP server, kreiranje serverskog soketa koji će koristiti HTTP server, na portu 80na portu 80

trytry{{ ServerSocket httpd = new ServerSocket(80);ServerSocket httpd = new ServerSocket(80);}}catch(IOException ex){catch(IOException ex){ System.err.println(ex);System.err.println(ex);}}

Konstruktor izbacuje IOException kada soket ne moKonstruktor izbacuje IOException kada soket ne može že biti kreiran i vezan za traženi port.biti kreiran i vezan za traženi port.IOException pri kreiranju ServerSocket-a skoro uvek IOException pri kreiranju ServerSocket-a skoro uvek znači dve stvari: drugi serverski soket iz potpuno drugog znači dve stvari: drugi serverski soket iz potpuno drugog programa već koristi traženi port, ili pokušavamo da se programa već koristi traženi port, ili pokušavamo da se konektujemo na port 1 do 1023 na Unix-u bez root konektujemo na port 1 do 1023 na Unix-u bez root privilegijaprivilegija

Page 12: Mrežno računarstvo

primer 1primer 1

varijacija PortScanner programa iz varijacija PortScanner programa iz prethodnog poglavljaprethodnog poglavljaproveravaju se portovi na lokalnoj mašini proveravaju se portovi na lokalnoj mašini pokušajem kreiranja ServerSocket pokušajem kreiranja ServerSocket objekata na njima i gledanjem na kojim objekata na njima i gledanjem na kojim portovima to ne uspevaportovima to ne uspevaAko koristite Unix i niste logovani kao root, Ako koristite Unix i niste logovani kao root, ovaj program radi samo za portove 1024 i ovaj program radi samo za portove 1024 i viševiše

Page 13: Mrežno računarstvo

page 5 of 51page 5 of 51

ostali konstruktoriostali konstruktori

Page 14: Mrežno računarstvo

Prihvatanje i zatvaranje konekcijaPrihvatanje i zatvaranje konekcijaServerSocket radi u petlji koja uzastopno prihvata ServerSocket radi u petlji koja uzastopno prihvata konekcijekonekcijesvaki prolazak kroz petlju poziva metod accept(). On svaki prolazak kroz petlju poziva metod accept(). On vraća Socket objekat koji predstavlja konekciju između vraća Socket objekat koji predstavlja konekciju između udaljenog klijenta i lokalnog serveraudaljenog klijenta i lokalnog serveraInterakcija sa klijentom dešava se kroz ovaj Socket Interakcija sa klijentom dešava se kroz ovaj Socket objekatobjekatKada se transakcija završi, server treba da pozove Kada se transakcija završi, server treba da pozove close() metod Socket-aclose() metod Socket-aAko klijent zatvori konekciju dok server još radi, input i Ako klijent zatvori konekciju dok server još radi, input i output stream-ovi koji povezuju server sa klijentom output stream-ovi koji povezuju server sa klijentom izbacuju InterruptedIOException prilikom sledećeg izbacuju InterruptedIOException prilikom sledećeg čitanja ili pisanjačitanja ili pisanjaU svakom slučaju, server treba da bude spreman da U svakom slučaju, server treba da bude spreman da obradi sledeću dolazeću konekciju.obradi sledeću dolazeću konekciju.Međutim, kada server treba da se ugasi i ne procesira Međutim, kada server treba da se ugasi i ne procesira daljnje konekcije, treba pozvati close() metod daljnje konekcije, treba pozvati close() metod ServerSocket objekta.ServerSocket objekta.

Page 15: Mrežno računarstvo

public Socket accept() throws public Socket accept() throws IOExceptionIOException

kada server podesi šta treba i spremni smo da kada server podesi šta treba i spremni smo da prihvatimo konekciju, pozivamo accept() metod prihvatimo konekciju, pozivamo accept() metod ServerSocket objektaServerSocket objekta

ovaj metod blokira, tj. stopira tok izvršavanja i ovaj metod blokira, tj. stopira tok izvršavanja i čeka dok se klijent ne konektuječeka dok se klijent ne konektuje

kada se klijent konektuje, metod vraća Socket kada se klijent konektuje, metod vraća Socket objekat. Koristimo tokove vraćene metodima objekat. Koristimo tokove vraćene metodima getInputStream() i getOutputSteram() Socket-a getInputStream() i getOutputSteram() Socket-a za komuniciranje sa klijentomza komuniciranje sa klijentom

Page 16: Mrežno računarstvo

primerprimer

ServerSocket server = new ServerSocket(5776);ServerSocket server = new ServerSocket(5776);while(true){while(true){ Socket connection = server.accept();Socket connection = server.accept(); OutputStreamWriter out = new OutputStreamWriter out = new

OutputStreamWriter(connection.getOutputStreaOutputStreamWriter(connection.getOutputStream());m());

out.write(”You’ve connected to this server. Bye-out.write(”You’ve connected to this server. Bye-bye now.\r\n”);bye now.\r\n”);

connectionconnection..close();close();}}

Page 17: Mrežno računarstvo

Ako ne Ako ne želite da program stoji dok čeka na želite da program stoji dok čeka na konekciju, stavite accept() u posebnu nitkonekciju, stavite accept() u posebnu nitimamo i opciju da koristimo kanale i neblokirajući imamo i opciju da koristimo kanale i neblokirajući I/O umesto niti. Na nekim (ne svim) VM ovo je I/O umesto niti. Na nekim (ne svim) VM ovo je mnogo brže nego niti i tokovimnogo brže nego niti i tokoviBitno je razlikovati izuzetke koji verovatno gase Bitno je razlikovati izuzetke koji verovatno gase server i izdaju poruku o grešci i izuzetke koji server i izdaju poruku o grešci i izuzetke koji samo treba da zatvore aktivnu konekcijusamo treba da zatvore aktivnu konekcijuIzuzeci izbačeni od accept() ili input ili output Izuzeci izbačeni od accept() ili input ili output stream-a generalno ne treba da ugase server. stream-a generalno ne treba da ugase server. Većina drugih izuzetaka verovatno treba. Da bi Većina drugih izuzetaka verovatno treba. Da bi se ovo uradilo, neophodno je ugnjezditi try-ove.se ovo uradilo, neophodno je ugnjezditi try-ove.

Page 18: Mrežno računarstvo

Konačno, većina servera želi da bude sigurna Konačno, većina servera želi da bude sigurna da su svi soketi koje su prihvatili zatvoreni kada da su svi soketi koje su prihvatili zatvoreni kada se oni završese oni završeČak i ako protokol zahteva da su klijenti Čak i ako protokol zahteva da su klijenti odgovorni za zatvaranje konekcije, klijenti ne odgovorni za zatvaranje konekcije, klijenti ne moraju uvek striktno da se pridržavaju protokolamoraju uvek striktno da se pridržavaju protokolapoziv close() takođe treba da bude unutar try-poziv close() takođe treba da bude unutar try-bloka koji hvata IOExceptionbloka koji hvata IOExceptionMeđutim, ako hvatate IOException kada Međutim, ako hvatate IOException kada zatvarate soket, ignorišite ga. To samo znači da zatvarate soket, ignorišite ga. To samo znači da je klijent zatvorio soket pre nego što je server je klijent zatvorio soket pre nego što je server uspeo.uspeo.

Page 19: Mrežno računarstvo

primerprimertry{try{ ServerSocket server = new ServerSocket(5776);ServerSocket server = new ServerSocket(5776); while(true){while(true){ Socket connection = server.accept();Socket connection = server.accept(); try{try{ Writer out = new OutputStreamWriter(connection.getOutputStream());Writer out = new OutputStreamWriter(connection.getOutputStream()); out.write(”You’ve connected to this server. Bye-bye now.\r\n”);out.write(”You’ve connected to this server. Bye-bye now.\r\n”); out.flush();out.flush(); connection.close();connection.close(); }} catch(IOException ex){catch(IOException ex){ // This tends to be a transitory error for this one connection;// This tends to be a transitory error for this one connection; // e.g. the client broke the connection early. Consequently, you// e.g. the client broke the connection early. Consequently, you // don’t want to break the loop or print an error message.// don’t want to break the loop or print an error message. // However, you might choose to log this exception in an error log.// However, you might choose to log this exception in an error log. }} finally{finally{ // Guarantee that sockets are close when complete// Guarantee that sockets are close when complete try{try{ if(connection!=null) connection.close();if(connection!=null) connection.close(); } catch(IOException ex){}} catch(IOException ex){} }} } } catch(IOException ex){catch(IOException ex){ System.err.println(ex);System.err.println(ex);}}

Page 20: Mrežno računarstvo

primer 2primer 2, daytime server, daytime server

implementira jednostavni daytime server kao implementira jednostavni daytime server kao RFC 867RFC 867ovaj server ovaj server šalje jednu liniju teksta kao odgovor šalje jednu liniju teksta kao odgovor na svaku konekciju, pa procesira svaku na svaku konekciju, pa procesira svaku konekciju neposrednokonekciju neposrednosloženiji serveri bi trebalo da generišu nit za složeniji serveri bi trebalo da generišu nit za obradu svakog zahtevaobradu svakog zahtevau ovom slučaju, overhead generisanja niti bi bio u ovom slučaju, overhead generisanja niti bi bio veći nego vreme potrebno da se obradi zahtevveći nego vreme potrebno da se obradi zahtevako se program pokreće na Unix-u mora se ako se program pokreće na Unix-u mora se pokrenuti kao root da bi se konektovalo na port pokrenuti kao root da bi se konektovalo na port 13 (ili promeniti broj porta na nešto iznad 1024)13 (ili promeniti broj porta na nešto iznad 1024)

Page 21: Mrežno računarstvo

primer 2 objašnjenjaprimer 2 objašnjenja

primer je pravolinijskiprimer je pravolinijski

klasa java.util.Date obezbeđuje vreme klasa java.util.Date obezbeđuje vreme pročitano sa serverovog internog satapročitano sa serverovog internog sata

konstanta DEFAULT_PORT postavljena je konstanta DEFAULT_PORT postavljena je na dobro poznati port 13 daytime serverana dobro poznati port 13 daytime servera

metod main() radi sav posaometod main() radi sav posao

ako se port zada u komandnoj liniji, koristi ako se port zada u komandnoj liniji, koristi se taj port, a inače podrazumevanise taj port, a inače podrazumevani

Page 22: Mrežno računarstvo

primer 2 objašnjenjaprimer 2 objašnjenja

spoljni try blok hvata IOException koji mogu spoljni try blok hvata IOException koji mogu nastati kada se ServerSocket objekat server nastati kada se ServerSocket objekat server konstruiše na daytime portu ili kada prihvata konstruiše na daytime portu ili kada prihvata konekcijekonekcijeunutrašnji try blok hvata izuzetke izbačene kada unutrašnji try blok hvata izuzetke izbačene kada se prihvaćene konekcije procesirajuse prihvaćene konekcije procesirajupoziva se metod accept() unutar beskonačne poziva se metod accept() unutar beskonačne petlje da pazi na nove konekcijepetlje da pazi na nove konekcijekao mnogi serveri, ovaj program se nikada ne kao mnogi serveri, ovaj program se nikada ne završava, već nastavlja da osluškuje do završava, već nastavlja da osluškuje do izbacivanja izuzetka ili dok ga ručno ne izbacivanja izuzetka ili dok ga ručno ne zaustavimo (Unix: Ctrl+C, kill pid)zaustavimo (Unix: Ctrl+C, kill pid)

Page 23: Mrežno računarstvo

primer 2 objašnjenjaprimer 2 objašnjenja

Kada se klijent konektuje, accept() metod vraća Kada se klijent konektuje, accept() metod vraća Socket objekat, koji se smešta u lokalnu Socket objekat, koji se smešta u lokalnu promenljivu connection, i program se nastavlja. promenljivu connection, i program se nastavlja. Zove se getOutputStream() da vrati izlazni tok Zove se getOutputStream() da vrati izlazni tok pridružen Socket-u i olančava na novi pridružen Socket-u i olančava na novi OutputStreamWriter, out.OutputStreamWriter, out.

Novi Date objekat obezbeđuje tekuće vreme. Novi Date objekat obezbeđuje tekuće vreme. Sadržaj se šalje klijentu pisanjem njegove string Sadržaj se šalje klijentu pisanjem njegove string reprezentacije na out pomoću write().reprezentacije na out pomoću write().

Page 24: Mrežno računarstvo

primer 2, objašnjenjaprimer 2, objašnjenja

Konačno, nakon što su podaci poslati ili je Konačno, nakon što su podaci poslati ili je izbačen izuzetak, finally blok zatvara konekciju.izbačen izuzetak, finally blok zatvara konekciju.Uvek zatvarajte soket nakon što ste završili sa Uvek zatvarajte soket nakon što ste završili sa njim.njim.U prethodnom poglavlju je rečeno da klijent ne U prethodnom poglavlju je rečeno da klijent ne treba da računa da će druga strana konekcije treba da računa da će druga strana konekcije zatvoriti soket. To se utrostručava za servere.zatvoriti soket. To se utrostručava za servere.Klijent istekne ili se sruši, korisnik otkaže Klijent istekne ili se sruši, korisnik otkaže transakcije, padne mreža... Zbog bilo kog od transakcije, padne mreža... Zbog bilo kog od ovih ili mora drugih razloga ne možemo računati ovih ili mora drugih razloga ne možemo računati da će klijenti zatvoriti sokete, čak i kada protokol da će klijenti zatvoriti sokete, čak i kada protokol to zahteva od njih, što ovaj ne zahteva.to zahteva od njih, što ovaj ne zahteva.

Page 25: Mrežno računarstvo

primer 3, time serverprimer 3, time server

slanje binarnih, netekstualnih podataka nije slanje binarnih, netekstualnih podataka nije značajno težeznačajno težetime server koji prati time protokol iz RFC 868time server koji prati time protokol iz RFC 868kada se klijent konektuje, server šalje 4-bajtni, kada se klijent konektuje, server šalje 4-bajtni, big endian, neoznačeni ceo broj koji određuje big endian, neoznačeni ceo broj koji određuje broj sekundi proteklih od 12:00 A.M. January 1, broj sekundi proteklih od 12:00 A.M. January 1, 1900 GMT (the epoch)1900 GMT (the epoch)Ponovo, tekuće vreme se određuje kreiranjem Ponovo, tekuće vreme se određuje kreiranjem novog Date objekta. Međutim, pošto klasa Date novog Date objekta. Međutim, pošto klasa Date računa milisekunde od 12:00 A.M. January 1, računa milisekunde od 12:00 A.M. January 1, 1970 GMT a ne od 1900, neophodna je 1970 GMT a ne od 1900, neophodna je konverzijakonverzija

Page 26: Mrežno računarstvo

public void close()public void close()

ako ste završili sa serverskim soketom, treba da ako ste završili sa serverskim soketom, treba da ga zatvorite, posebno ako će program nastaviti ga zatvorite, posebno ako će program nastaviti još neko vreme da se izvršavajoš neko vreme da se izvršavaovo oslobađa port tako da mogu da ga koriste ovo oslobađa port tako da mogu da ga koriste drugi programi, ako želedrugi programi, ako železatvaranje ServerSocket-a ne treba mešati sa zatvaranje ServerSocket-a ne treba mešati sa zatvaranjem Socket-azatvaranjem Socket-azatvaranje ServerSocket-a osobađa port na zatvaranje ServerSocket-a osobađa port na lokalnom host-u, dopuštajući drugom serveru da lokalnom host-u, dopuštajući drugom serveru da se veže na njega. Takođe raskida sve trenutno se veže na njega. Takođe raskida sve trenutno otvorene sokete koje je ServerSocket prihvatiootvorene sokete koje je ServerSocket prihvatio

Page 27: Mrežno računarstvo

Serverski soketi se zatvaraju automatski Serverski soketi se zatvaraju automatski kada program umre, pa nije apsolutno kada program umre, pa nije apsolutno neophodno zatvarati ih u programima koji neophodno zatvarati ih u programima koji se završavaju kratko nakon što se završavaju kratko nakon što ServerSocket više nije potrebanServerSocket više nije potrebanIpak, to ne boli.Ipak, to ne boli.Primer: LocalPortScanner može biti bolje Primer: LocalPortScanner može biti bolje napisan tako da trenutno ne zauzima napisan tako da trenutno ne zauzima većinu portova sistemavećinu portova sistema

Page 28: Mrežno računarstvo

primerprimer

for(int port = 1; port <= 65535; port++){for(int port = 1; port <= 65535; port++){ try{try{ // the next line will fail and drop into the// the next line will fail and drop into the // catch block if there is already a server// catch block if there is already a server // running on the port// running on the port ServerSocket server = new ServerSocket(port);ServerSocket server = new ServerSocket(port); server.close();server.close(); }} catch(IOException ex){catch(IOException ex){ System.out.println(”There is a server on port “ + port + System.out.println(”There is a server on port “ + port +

”.”);”.”); }}} // end for} // end for

Page 29: Mrežno računarstvo

Nakon Nakon što je serverski soket zatvoren, ne može biti što je serverski soket zatvoren, ne može biti rekonektovan, čak ni na isti portrekonektovan, čak ni na isti portpublic boolean isClosed()public boolean isClosed()

vraća true ako je serverski soket zatvorenvraća true ako je serverski soket zatvoren... page 14 of 51 (o metodu isClosed())... page 14 of 51 (o metodu isClosed())public boolean isBound() – da li je serverski soket public boolean isBound() – da li je serverski soket (ikada) vezan za port (čak i ako je trenutno zatvoren)(ikada) vezan za port (čak i ako je trenutno zatvoren)za testiranje da li je soket otvoren:za testiranje da li je soket otvoren:

public static boolean isOpen(ServerSocket ss)public static boolean isOpen(ServerSocket ss){{ return ss.isBound() && !ss.isClosed();return ss.isBound() && !ss.isClosed();}}

Page 30: Mrežno računarstvo

get*() metodiget*() metodi

public InetAddress getInetAddress()public InetAddress getInetAddress()

ako joako još nije vezan za mrežni interfejs, š nije vezan za mrežni interfejs, vraća nullvraća null

public int getLocalPort()public int getLocalPort()

ako još nije vezan za port, vraća -1ako još nije vezan za port, vraća -1