Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Programowanie sieciowe w Javie Michał Kuciapski

Podobne prezentacje


Prezentacja na temat: "Programowanie sieciowe w Javie Michał Kuciapski"— Zapis prezentacji:

1 Programowanie sieciowe w Javie Michał Kuciapski m.kuciapski@univ.gda.pl

2 Gniazda

3 Gniazda klientów

4 4 z 53 Koncepcja Gniazda są abstrakcyjnym bytem umożliwiającym pominięcie pisania kodu dla obsługi szczegółów sieci związanych z transmisją danych: rodzajem nośników, rozmiarami, tworzeniem, łączeniem i retransmisją pakietów, sprawdzaniem sekwencji, adresowaniem sieciowym, rutingiem. Gniazda pozwalają traktować połączenie jako zwykły strumień umożliwiający zapisywanie i pobieranie bajtów (danych).

5 5 z 53 Możliwe do wykonania operacje połączyć się ze zdalną maszyną wysłanie danych odebranie danych zamknięcie połączenia połączyć się ze zdalnym portem odebrać połączenie od zdalnej maszyny czekać na nadchodzące dane

6 6 z 53 Typowy scenariusz połączenia Utworzenie gniazda Próba połączenie ze zdalnym hostem Pobieranie/wysyłanie danych lub zwrócenie błędu Zamknięcie połączenia

7 7 z 53 Tworzenie gniazda - konstruktory Dostępnych jest wiele konstruktorów, z czego 4 są aprobowane, 2 dla wirtualnych maszyn Javy Utworzenie gniazda wymaga dodania obsługi wyjątków: –UnknownHostException –IOException – związany z problemem połączenia, np.: Błędy odbioru połączenia Brak udostępnionego portu Błędy przekierowań

8 8 z 53 Tworzenie 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)

9 9 z 53 Tworzenie gniazda - przykład 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.getByName("83.11.56.140"); InetAddress zdalny = InetAddress.getByName("bsvc.univ.gda.pl");

10 10 z 53 Tworzenie gniazda – przykład – c.d. Socket gniazdo = new Socket(zdalny,80,lokalny,1350); System.out.println("Na porcie działa serwer"); } catch(UnknownHostException e) { System.err.println(e); } catch(IOException e) { System.err.println(e); }

11 11 z 53 Pobieranie informacji z gniazda InetAddress getInetAddress() int getPort() int getLocalPort() InetAddress getLocalAddress()

12 12 z 53 Pobieranie informacji z gniazda – przykład 1 Dodatkowy kod dla wcześniejszego przykładu String nLokalny = "83.11.56.140"; String nZdalny = "bsvc.univ.gda.pl"; System.out.println("Połączenie z serwerem: " + gniazdo.getInetAddress().getHostName() + " o adresie: " + gniazdo.getInetAddress().getHostAddress() + " na porcie " + gniazdo.getPort() + "\nZ hosta: " + gniazdo.getLocalAddress().getCanonicalHostName() + " o adresie: " + gniazdo.getLocalAddress().getHostAddress() + " na porcie: " + gniazdo.getLocalPort());

13 13 z 53 Pobieranie informacji z gniazda – przykład 2 import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; 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); } }}

14 14 z 53 Pobieranie i wysyłanie danych z gniazda pobieranie danych InputStream getInputStream() throws IOException wysyłanie danych OutputStream getOutputStream() throws IOException zazwyczaj powyższe strumienie łączy się łańcuchowo z innymi dla wygodniejszego pobierania i przesyłania danych

15 15 z 53 Pobieranie i wysyłanie danych z gniazda Przykłady klas obudowujących: strumień wejściowy: – InputStreamReader(InputStream in) – BufferedReader(Reader in) – dla buforowania InputStreamReader Strumień wyjściowy: – PrintWriter(OutputStream out) – OutputStreamWriter(OutputStream out)

16 16 z 53 Metody związane z pobieraniem danych Dla klasy InputStream - int read() Dla klasy InputStreamReader – int read() Dla klasy BufferedReader – String readLine()

17 17 z 53 Metody związane z wysyłaniem 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 strumień !!!

18 18 z 53 Zamykanie strumieni i gniazd po zakończeniu połączenia należy zamknąć strumienie wejściowe i wyjściowe w związku z potencjalnym wystąpieniem błędu komunikacji z serwerem należy dodać zamykanie strumieni w obsłudze wyjątków w bloku finally gniazda jak i strumienie zamyka się poprzez metodę void close() Możliwe jest zamknięcie jednostronne gniazda: –void shutDownInput() throws IOException

19 19 z 53 Pobieranie danych - przykład 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()); }

20 20 z 53 Pobieranie danych – przykład c.d catch(UnknownHostException e) { System.out.println(e); } catch(IOException e) { System.out.println(e); }

21 21 z 53 Wysyłanie danych - przykład import java.io.*; import java.net.*; public class wysDanych { public static void main(String args[]) { OutputStreamWriter str; try { for (int i=0; i<10;i++) { Socket gn = new Socket("localhost", 1300); str = new OutputStreamWriter(gn.getOutputStream()); str.write("Połącznie sieciowe działa \r\n"); str.flush(); }

22 22 z 53 Wysyłanie danych – przykład c.d catch(UnknownHostException e) { System.out.println(e); } catch(IOException e) { System.out.println(e); }

23 23 z 53 Opcje gniazd - podstawowe void setTcpNoDelay(boolean on) throws IOException – umożliwia natychmiastowe wysyłanie pakietów boolean getTcpNoDelay() throws IOException void setSoTimeout(int milisekundy) throws SocketException – umożliwia ustalenie czasu czekania na połączenie int getSoTimeout () throws SocketException void setKeepAlive(boolean on) throws SocketException – powoduje okresowe przesyłanie pakietów boolean getKeepAlive() throws SocketException Java 1.3

24 24 z 53 Pobieranie i wysyłanie danych - przykład 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(hostDomyslny); Socket gniazdo = new Socket(adres, portDomyslny);

25 25 z 53 Pobieranie i wysyłanie danych – przykład c.d. Writer wys = new OutputStreamWriter(gniazdo.getOutputStream(),"8859_1"); InputStream wcz = gniazdo.getInputStream(); for (int i=0;i<args.length;i++) wys.write(args[i] + " "); wys.write("\r\n"); wys.flush(); int wczZn; while((wczZn=wcz.read())!=-1) System.out.print((char)wczZn); }

26 26 z 53 Pobieranie i wysyłanie danych – przykład c.d. catch (UnknownHostException e) { System.err.println(e); } catch (IOException e) { System.err.println(e); }

27 Gniazda Gniazda serwerów

28 28 z 53 Cykl życia serwera Utworzenie na określonym porcie serwera jako obiektu klasy ServerSocket Oczekiwanie przez serwer na połączenia z portem serwera za pomocą metody accept() zwracające po uzyskaniu połączenia obiekt klasy Socket reprezentujący połączenie pomiędzy klientem i serwerem W zależności od funkcjonalności serwera pobranie strumienia wejściowego lub wyjściowego Komunikacja typu klient-serwer do momentu zakończenia połączenia Zamknięcie połączenia przez klienta, serwer lub obie strony połączenia Powrót do oczekiwania na połączenie

29 29 z 53 Tworzenie serwera - konstruktory Dostępnych są cztery publiczne konstruktory i 2 przeznaczone dla twórców wirtualnych maszyn Javy Utworzenie serwera wymaga dodania obsługi wyjątków: –BindException – nie można utworzyć gniazda i powiązać go z określonym portem –IOException – problemem połączenia i wymiany danych

30 30 z 53 Tworzenie serwera - konstruktory new ServerSocket() new ServerSocket(int port) new ServerSocket(int port, int długośćKolejki) new ServerSocket(int port, int długośćKolejki, InetAddress interfejs)

31 31 z 53 Przyjmowanie i zamykanie połączeń Przyjmowanie połączeń – public Socket accept() throws IOException Zamykanie połączeń – public void close() throws IOException

32 32 z 53 Tworzenie serwera – przykład 1 import java.net.*; import java.io.*; public class SkanowaniePortowLokalnych { public static void main(String args[]) { for(int port=1; port<100; port++) try { ServerSocket serwer = new ServerSocket(port); } catch (IOException e) { System.out.println("Na porcie " + port + " działa serwer"); } }}

33 33 z 53 Tworzenie serwera – przykład 1 import java.net.*; import java.io.*; public class SkanowaniePortowLokalnych { public static void main(String args[]) { for(int port=1; port<100; port++) try { ServerSocket serwer = new ServerSocket(port); } catch (IOException e) { System.out.println("Na porcie " + port + " działa serwer"); } }}

34 34 z 53 Tworzenie serwera – przykład 2 import java.net.*; import java.io.*; public class SerwerZOgraniczeniemKolejki { public static void main(String args[]) { try { ServerSocket serwer = new ServerSocket(port, 1, InetAddres.getHostByName(153.19.122.214)); } catch (IOException e) { System.out.println("Na porcie " + port + " działa serwer"); }

35 35 z 53 Pobieranie danych o serwerze Adresu serwera – public InetAddress getInnetAddress() Portu serwera – public int getLocalPort() Zespołu danych - public String toString();

36 36 z 53 Pobieranie danych o serwerze – przykład import java.net.*; import java.io.*; public class SerwerLosowyPort { public static void main(String args[]) { ServerSocket serwer = null; for(int i=1; i<5; i++) try { // sprawdzić dla braku podania hosta serwer = new ServerSocket(0,10, InetAddress.getLocalHost());

37 37 z 53 Pobieranie danych o serwerze – przykład c.d. System.out.println("Serwer uruchomiony na hoscie: \n Host: " + serwer.getInetAddress().getHostName() + "\n Adres: " + serwer.getInetAddress().getHostAddress() + "\n Port: " + serwer.getLocalPort()); //System.out.println("Dane serwera: " + serwer.toString()); } catch (IOException e) { System.out.println("Na porcie " + serwer.getLocalPort() + " działa serwer"); }

38 38 z 53 Opcje gniazd serwerów - podstawowe void setSoTimeout(int milisekundy) throws SocketException – umożliwia ustalenie czasu czekania na połączenie przez metodę accept(). Po upłynięciu limitu czasu zgłasza wyjątek InterruptedException int getSoTimeout () throws IOException – zwraca bieżącą wartość SO_TIMEOUT

39 39 z 53 Pobieranie danych o serwerze – przykład import java.net.*; import java.io.*; public class SerwerLimitPoloczenia { public static void main(String args[]) { try { Serwer serwer = new ServerSocket(100); System.out.println("Limit połączenia: " + serwer.getSoTimeout()); serwer.setSoTimeout(3000); catch (IOException e) { System.out.println("Na porcie " + port + " działa serwer"); }

40 40 z 53 Pobieranie i wysyłanie danych z gniazda pobieranie danych InputStream getInputStream() throws IOException wysyłanie danych OutputStream getOutputStream() throws IOException zazwyczaj powyższe strumienie łączy się łańcuchowo z innymi dla wygodniejszego pobierania i przesyłania danych

41 41 z 53 Pobieranie i wysyłanie danych z gniazda Przykłady klas obudowujących: strumień wejściowy: – InputStreamReader(InputStream in) – BufferedReader(Reader in) – dla buforowania InputStreamReader Strumień wyjściowy: – PrintWriter(OutputStream out) – OutputStreamWriter(OutputStream out)

42 42 z 53 Metody związane z pobieraniem danych Dla klasy InputStream - int read() Dla klasy InputStreamReader – int read() Dla klasy BufferedReader – String readLine()

43 43 z 53 Metody związane z wysyłaniem 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 strumień !!!

44 44 z 53 Zamykanie strumieni i gniazd po zakończeniu połączenia należy zamknąć strumienie wejściowe i wyjściowe w związku z potencjalnym wystąpieniem błędu komunikacji z serwerem należy dodać zamykanie strumieni w obsłudze wyjątków w bloku finally gniazda jak i strumienie zamyka się poprzez metodę void close() Możliwe jest zamknięcie jednostronne gniazda: –void shutDownInput() throws IOException

45 45 z 53 Zamykanie strumieni i gniazd po zakończeniu połączenia należy zamknąć strumienie wejściowe i wyjściowe w związku z potencjalnym wystąpieniem błędu komunikacji z serwerem należy dodać zamykanie strumieni w obsłudze wyjątków w bloku finally gniazda jak i strumienie zamyka się poprzez metodę void close() Możliwe jest zamknięcie jednostronne gniazda: –void shutDownInput() throws IOException

46 46 z 53 Pobieranie danych– przykład import java.io.*; import java.net.*; public class serwerPob { public static void main(String args[]) { try { ServerSocket server = new ServerSocket(1300); while(true) {

47 47 z 53 Pobieranie danych– przykład c.d Socket gniazdo = server.accept(); BufferedReader str = new BufferedReader(new InputStreamReader(gniazdo.getInputStream())); System.out.println(str.readLine()); } catch(IOException e) { System.out.println(e.getMessage()); }

48 48 z 53 Wysyłanie danych– przykład import java.io.*; import java.net.*; public class serwerWys { public static void main(String args[]) { try { ServerSocket server = new ServerSocket(1310); while(true) {

49 49 z 53 Wysyłanie danych– przykład c.d gniazdo = server.accept(); OutputStreamWriter str = new OutputStreamWriter(gniazdo.getOutputStream()); str.write("Połączenie sieciowe działa\r\n"); str.flush(); gniazdo.close(); } catch(IOException e) { System.out.println(e.getMessage()); }

50 50 z 53 Serwer - przykład import java.io.*; import java.net.*; public class testerKlientow { public static void main(String args[]) { try { String strona; System.out.println("Napisz jaki tekst chcesz wysyłać przeglądarkom: "); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String tekst = br.readLine(); strona = "HTTP/1.0 200 OK\r\n" + "Server: Michal Kuciapski 1.0\r\n" + "Content-length: " + tekst.length() + "\r\n" + "Content-type: text/plain" + "\r\n\r\n" + tekst;

51 51 z 53 Serwer – przykład c.d. ServerSocket serwer = new ServerSocket(80); while(true) { Socket gniazdo = serwer.accept(); try { System.out.println("Nawiązano połączenie z: " + gniazdo.toString()); InputStream is = gniazdo.getInputStream(); BufferedReader wej = new BufferedReader(new InputStreamReader(is)); while(true) {

52 52 z 53 Serwer – przykład c.d. String wcz = wej.readLine(); if (wcz == null) break; else if (wcz.equalsIgnoreCase("Connection: Keep-Alive")) { System.out.println(wcz); OutputStreamWriter wyj = new OutputStreamWriter(gniazdo.getOutputStream()); wyj.write(strona + "\r\n") ; wyj.flush(); } else System.out.println(wcz); }

53 53 z 53 Serwer – przykład c.d. catch(IOException e) { System.out.println("Wystąpił bład: " + e.getMessage()); } catch(SocketException e) { System.out.println("Wystąpił bład: " + e.getMessage()); } catch(IOException e) { System.out.println("Wystąpił bład: " + e.getMessage()); }


Pobierz ppt "Programowanie sieciowe w Javie Michał Kuciapski"

Podobne prezentacje


Reklamy Google