Title: Programowanie sieciowe w Javie
1Programowanie sieciowe w Javie
- Michal Kuciapski
- m.kuciapski_at_univ.gda.pl
2Mozliwosci sieciowe Javy
3Korzysci z zastosowania Javy w programowaniu
sieciowym
- Jezyk zaprojektowany z mysla o sieci
niezaleznosc od platformy, miedzynarodowy zestaw
znaków, bezpieczenstwo - Bogaty zestaw klas i metod sieciowych
- Znaczne uproszczenie obslugi dzialania sieci
4Obszary zastosowan
- Pobieranie i wyswietlanie danych alternatywa
dla PHP, CGI, ASP, itd. - Powtarzalne pobieranie i przesylanie danych
- przechowywanie plików
- obliczenia równolegle
- Formularze
- Komunikacja synchroniczna i asynchroniczna
- Serwery sieciowe
5Obszary zastosowan c.d.
- Przeszukiwanie zasobów sieci
- Tworzenie interaktywnych stron JSP
- Handel i bankowosc elektroniczna Java
Cryptography Extension - Multimedia audio/video
6Podstawowe zagadnienia zwiazane z sieciami
7Warstwy sieci
Aplikacji
Aplikacji
Transportowa
Transportowa
Sieciowa
Sieciowa
Fizyczna
8Adresowanie adresy IP
- kazdy host w sieci ma przypisany adres IP który
jest unikalny przynajmniej w ramach sieci
lokalnej - adres IP sklada sie z 4 oktetów, z których kazdy
jest cyfra z zakresu od 0 do 255 - adresy z puli adresów prywatnych
- Klasa A 10.x.x.x
- Klasa B 172.16.x.x 172.31.x.x
- Klasa C 192.168.x.x
- pula adresów dla testowania 127.0.x.x
9Adresowanie nazwy przyjazne
- przypisywane adresom IP przy wykorzystaniu
systemu DNS - FQDN system jednoznacznego identyfikowania
hostów w oparciu o hierarchiczna strukture DNS
np. bsvc.univ.gda.pl
10Porty
- umozliwiaja wykonywanie wielu zadan
równoczesnie - sa elementem abstrakcyjnym uchwytem do
strumienia wejsciowego i (lub) wyjsciowego - moga byc przydzielone konkretnej usludze
- kazdy port jest identyfikowalny liczba z zakresu
od 1 do 65 535 - Zarezerwowane dla znanych uslug 1-1023
11Porty przyklady podstawowych
Nazwa Numer portu Typ
echo 7 TCP/UDP
daytime 13 TCP/UDP
ftp-data 20 TCP
FTP 21 TCP
Telnet 23 TCP
SMTP 25 TCP
finger 79 TCP
HTTP 80 TCP
POP3 120 TCP
NNTP 119 TCP
RMI Registry 1099 TCP
12Pakiety sieciowe
13Pakiety sieciowe
Nazwa Opis
java.net Podstawowy pakiet z klasami sieciowymi
java.applet Metody sieciowe appletów np. getImage, getAudiClip
javax.net Klasy zwiazane z tworzeniem bezpiecznych gniazd SSL
com.sun.net.ssl Klasa suna dla szyfrowania
java.rmi Klasy zdalnego wywolywania metod
javax.rmi Klasy umozliwiajace zdalnego wywolywania metod zgodnie z CORBA i przy wykorzystaniu SSL
javax.mail Klasy umozliwiajace obsluge poczty elektronicznej
14Wyszukiwanie adresów
15Klasa
- klasa InetAddress opisuje adres komputera w sieci
poprzez nazwe/domene, np. bsvc.univ.gda.pl oraz
poprzez numer IP, np. 153.19.122.213 - obiekty klasy InetAddress sa tworzone poprzez
metody statyczne, nie sa dostepne zadne
konstruktory - wszystkie metody musza zawierac deklaracje lub
obsluge wyjatku UnknownHostException
16Tworzenie obiektu
- InetAddress.getByName(String Nazwa)
- InetAddress.getAllByName(String Nazwa)
- InetAddress.getLocalHost(String Nazwa)
17Przyklad
import java.net. public class Adresy public
static void main(String args) try
InetAddress lokalny InetAddress.getLocalHost()
System.out.println("Adres komputera
lokalnego " lokalny) InetAddress zdalny
InetAddress.getByName("netbeens.org")
System.out.println("Adres komputera
www.netbeens.org " zdalny)
18Przyklad c.d.
- InetAddress wszystkieZdalny
InetAddress.getAllByName("www.netbeens.org") - System.out.println("Adresy komputera
www.netbeens.org to") - for(int i0 iltwszystkieZdalny.length i)
-
- System.out.println(wszystkieZdalnyi)
-
- catch (UnknownHostException he)
- he.printStackTrace()
-
-
-
19Metody
- Public String getHostName() zwraca nazwe hosta
- Public byte getAddress() zwraca adres hosta
jato tablice byte - Public String getHostAddress() zwraca nazwe
hosta jako tekst - Nie ma dostepnych metod typu setHostName() czy
setHostAddress()
20Metody przyklad
- import java.net.
- public class daneHosta
- public static void main(String args)
-
- String nHosta "localhost"
- try
-
- InetAddress host InetAddress.getByNam
e(nHosta) - byte adresIP host.getAddress()
- String adres ""
-
21Metody przyklad c.d.
- for (int i0 iltadresIP.length i)
-
- int przekNaByte adresIPi lt 0 ?
adresIPi 256 adresIPi - adres przekNaByte
- if (i ! adresIP.length -1)
- adres "."
-
-
22Metody przyklad c.d.
- System.out.println("Nazwa hosta "
host.getHostName() - "\nadres IP poprzez tablice "
adres - "\nadres IP poprzez tekst "
host.getHostAddress()) -
- catch(UnknownHostException e)
-
- System.out.println("Host " nHosta
"nie istnieje") -
-
23Gniazda
24Gniazda
25Koncepcja
- Gniazda sa abstrakcyjnym bytem umozliwiajacym
pominiecie pisania kodu dla obslugi szczególów
sieci zwiazanych z transmisja danych rodzajem
nosników, rozmiarami, tworzeniem, laczeniem i
retransmisja pakietów, sprawdzaniem sekwencji,
adresowaniem sieciowym, rutingiem. - Gniazda pozwalaja traktowac polaczenie jako
zwykly strumien umozliwiajacy zapisywanie i
pobieranie bajtów (danych).
26Mozliwe do wykonania operacje
- polaczyc sie ze zdalna maszyna
- wyslanie danych
- odebranie danych
- zamkniecie polaczenia
- polaczyc sie ze zdalnym portem
- odebrac polaczenie od zdalnej maszyny
- czekac na nadchodzace dane
27Typowy scenariusz polaczenia
- Utworzenie gniazda
- Próba polaczenie ze zdalnym hostem
- Pobieranie/wysylanie danych lub zwrócenie bledu
- Zamkniecie polaczenia
28Tworzenie gniazda - konstruktory
- Dostepnych jest wiele konstruktorów, z czego 4 sa
aprobowane, 2 dla wirtualnych maszyn Javy - Utworzenie gniazda wymaga dodania obslugi
wyjatków - UnknownHostException
- IOException zwiazany z problemem polaczenia,
np. - Bledy odbioru polaczenia
- Brak udostepnionego portu
- Bledy przekierowan
29Tworzenie gniazda - konstruktory
- new Socket(String host, int port )
- new Socket(InetAddress host, int port )
- new Socket(String host , int port , InetAddress
interfejs , int portLokalny) - new Socket(InetAddress host , int port ,
InetAddress interfejs , int portLokalny)
30Tworzenie gniazda - przyklad
- import java.net.InetAddress
- import java.net.Socket
- import java.net.UnknownHostException
- import java.io.IOException
- public class TworzenieGniazda
-
- public static void main(String args)
-
- try
-
- InetAddress lokalny InetAddress.getByNa
me("83.11.56.140") - InetAddress zdalny InetAddress.getByNam
e("bsvc.univ.gda.pl") -
31Tworzenie gniazda przyklad c.d.
- Socket gniazdo new Socket(zdalny,80,lokaln
y,1350) - System.out.println("Na porcie dziala
serwer") -
- catch(UnknownHostException e)
-
- System.err.println(e)
-
- catch(IOException e)
-
- System.err.println(e)
-
-
-
32Pobieranie informacji z gniazda
- InetAddress getInetAddress()
- int getPort()
- int getLocalPort()
- InetAddress getLocalAddress()
33Pobieranie informacji z gniazda przyklad 1
String nLokalny "83.11.56.140" String nZdalny
"bsvc.univ.gda.pl" System.out.println("Polacze
nie z serwerem " gniazdo.getInetAddress().g
etHostName() " o adresie "
gniazdo.getInetAddress().getHostAddress() " na
porcie " gniazdo.getPort() "\nZ hosta "
gniazdo.getLocalAddress().getCanonicalHostName()
" o adresie " gniazdo.getLocalAddress().
getHostAddress() " na porcie "
gniazdo.getLocalPort())
Dodatkowy kod dla wczesniejszego przykladu
34Pobieranie informacji z gniazda przyklad 2
import java.net.InetAddress import
java.net.Socket import java.net.UnknownHostExcept
ion import java.io.IOException public class
GniazdoInformacje2 public static void
main(String args) String nZdalny
"bsvc.univ.gda.pl" try
Socket gniazdo new Socket("www.oracle.com",80
) System.out.println(gniazdo.toString())
catch(UnknownHostException e)
System.err.println(e)
catch(IOException e)
System.err.println(e)
35Pobieranie i wysylanie danych z gniazda
- pobieranie danych
- InputStream getInputStream() throws
IOException - wysylanie danych
- OutputStream getOutputStream() throws
IOException - zazwyczaj powyzsze strumienie laczy sie
lancuchowo z innymi dla wygodniejszego pobierania
i przesylania danych
36Pobieranie i wysylanie danych z gniazda
- Przyklady klas obudowujacych
- strumien wejsciowy
- InputStreamReader(InputStream in)
- BufferedReader(Reader in) dla buforowania
- InputStreamReader
- Strumien wyjsciowy
- PrintWriter(OutputStream out)
- OutputStreamWriter(OutputStream out)
37Metody zwiazane z pobieraniem danych
- Dla klasy InputStream - int read()
- Dla klasy InputStreamReader int read()
- Dla klasy BufferedReader String readLine()
38Metody zwiazane z wysylaniem danych
- Dla klasy OutputStream - void write(int dane)
throws - IOException
- Dla klasy PrintWriter void print(String dane)
- Dla klasy OutputStreamWriter void write(String
dane) throws IOException - void flush() throws IOException wyczyszcza
strumien !!!
39Zamykanie strumieni i gniazd
- po zakonczeniu polaczenia nalezy zamknac
strumienie wejsciowe i wyjsciowe - w zwiazku z potencjalnym wystapieniem bledu
komunikacji z serwerem nalezy dodac zamykanie
strumieni w obsludze wyjatków w bloku finally - gniazda jak i strumienie zamyka sie poprzez
metode - void close()
- Mozliwe jest zamkniecie jednostronne gniazda
- void shutDownInput() throws IOException
- void shutDownInput() throws IOException
40Pobieranie danych - przyklad
- import java.io.
- import java.net.
- public class pobDanych
- public static void main(String args)
- try
-
- Socket gn new Socket("localhost",
1310) - InputStreamReader strumWe new
- InputStreamReader(gn.getInputStream())
- BufferedReader br new
BufferedReader(strumWe) - System.out.println(br.readLine())
-
-
41Pobieranie danych przyklad c.d
- catch(UnknownHostException e)
-
- System.out.println(e)
-
- catch(IOException e)
-
- System.out.println(e)
-
-
-
42Wysylanie danych - przyklad
- import java.io.
- import java.net.
- public class wysDanych
- public static void main(String args)
- OutputStreamWriter str
- try
-
- for (int i0 ilt10i)
- Socket gn new
Socket("localhost", 1300)
str new OutputStreamWriter(gn.getOutputStre
am()) - str.write("Polacznie sieciowe
dziala \r\n") - str.flush()
-
-
43Wysylanie danych przyklad c.d
- catch(UnknownHostException e)
-
- System.out.println(e)
-
- catch(IOException e)
-
- System.out.println(e)
-
-
-
44Opcje gniazd - podstawowe
- void setTcpNoDelay(boolean on) throws IOException
umozliwia natychmiastowe wysylanie pakietów - boolean getTcpNoDelay() throws IOException
- void setSoTimeout(int milisekundy) throws
SocketException umozliwia ustalenie czasu
czekania na polaczenie - int getSoTimeout () throws SocketException
- void setKeepAlive(boolean on) throws
SocketException powoduje okresowe przesylanie
pakietów - boolean getKeepAlive() throws SocketException
Java 1.3
45Pobieranie i wysylanie danych - przyklad
- import java.net.
- import java.io.
- public class WhoisKlient
- public static void main(String args)
-
- int portDomyslny 43
- String hostDomyslny "whois.internic.net"
- InetAddress adres
- try
-
- adres InetAddress.getByName(hostDomy
slny) - Socket gniazdo new Socket(adres,
portDomyslny)
46Pobieranie i wysylanie danych przyklad c.d.
- Writer wys new OutputStreamWriter(gniazdo.getOu
tputStream(),"8859_1") - InputStream wcz gniazdo.getInputStre
am() - for (int i0iltargs.lengthi)
- wys.write(argsi " ")
-
- wys.write("\r\n")
- wys.flush()
-
- int wczZn
- while((wczZnwcz.read())!-1)
- System.out.print((char)wczZn)
-
-
47Pobieranie i wysylanie danych przyklad c.d.
- catch (UnknownHostException e)
-
- System.err.println(e)
-
- catch (IOException e)
-
- System.err.println(e)
-
-
-