Programowanie sieciowe w Javie Michał Kuciapski

Slides:



Advertisements
Podobne prezentacje
Wstęp do strumieni danych
Advertisements

Programowanie wizualne PW – LAB5 Wojciech Pieprzyca.
Mechanizmy pracy równoległej
Mgr inż.Marcin Borkowski Podstawy Java Część II
Mgr inż.Marcin Borkowski Podstawy Java Krótkie wprowadzenie dla studentów Wyższej Szkoły Ekologii i Zarządzania
Programowanie obiektowe
Dzisiejszy wykład Wyjątki.
Bezpieczeństwo wyjątków w C++: OpenGL
Tworzenie i obsługa programów – przykład 3 uwagi cd. Wykorzystując różne klasy biblioteki języka Java należy pamiętać w jakim pakiecie się znajdują. Wszystkie.
Przegląd protokołów rodziny TCP/IP (1)
Budowa Sewera i Klienta. Funkcja Connect (1) Funkcja Connect (2)
Rozszerzalność systemów rozproszonych
Autor Roman Jędras Prowadzący: dr inż. Antoni Izworski Przedmiot:
Projektowanie programu obsługującego gniazdka
Nguyen Hung Son Uniwersytet Warszawski
Podstawy Programowania sieciowego w Javie
RMI I RMI-IIOP Wprowadzenie Co to jest RMI?
Bartosz Walter Inżynieria oprogramowania Lecture XXX JavaTM – część II Bartosz Walter
Inżynieria oprogramowania Lecture XXX JavaTM – część IV: IO
Programowanie sieciowe w Javie
Obsługa serwera zdalnego przez klienta FTP
Zaawansowane technologie Javy Wykład 5 (6 marca 2012) Programowanie sieciowe (1)
Java – technologie zaawansowane Wykład 5 (4 kwietnia 2011) Programowanie sieciowe – URL.
Gniazda komunikacji sieciowej w języku Java
Język ANSI C Operacje we/wy
.NET Remoting Łukasz Zawadzki.
Czytanie, pisanie i rysowanie – cd.. Jeszcze jeden strumyk PrintStream działa jak PrintWriter, ale: Używa domyślnego (systemowego) kodowania Nie wyrzuca.
Czytanie, pisanie i rysowanie (czyli klasa I szkoły podstawowej)
Obsługa systemu wejścia-wyjścia
Język Java Wielowątkowość.
12. GNIAZDA BSD Biblioteka funkcji związanych z gniazdami jest interfejsem programisty do obsługi protokołów komunikacyjnych. Została utworzona dla Unixa.
Inżynieria Oprogramowania
Serializacja Serializacja pozwala zamienić obiekt na sekwencję bajtów, w sposób umożliwiający później wierne odtworzenie jego zawartości Inna nazwa to.
Pakiety w Javie Łukasz Smyczyński (132834). Czym są pakiety? Klasy w Javie są grupowane w pewne zbiory zwane pakietami. Pakiety są więc pewnym podzbiorem.
Podstawy programowania II Wykład 2: Biblioteka stdio.h Zachodniopomorska Szkoła Biznesu.
Programowanie urządzeń mobilnych – wykład IV
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
W większości języków programowania biblioteki wejścia/wyjścia ukrywają szczegóły obsługi poszczególnych mediów pod abstrakcją strumienia (ang. stream).
Tworzenie aplikacji mobilnych
Obsługa systemu wejścia-wyjścia
Programowanie obiektowe – zastosowanie języka Java SE
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Seminarium problemowe
Systemy wejścia i wyjścia Michał Wrona. Co to jest system wejścia i wyjścia? Pobierania informacji ze źródeł danych, zdolnych przesyłać sekwencje bajtów,
Tworzenie Aplikacji Internetowych dr Wojciech M. Gańcza 8.
Komunikacja przez sieć z wykorzystaniem biblioteki WINSOCK
1 Strumienie Hierarchie klas strumieniowych, strumienie bajtowe - klasy InputStream i OutputStream i ich metody, klasa File, strumienie plikowe, strumienie.
Programowanie sieciowe w Javie
Aplikacje TCP i UDP. Łukasz Zieliński
1 Programowanie sieciowe Protokoły sieciowe, model warstwowy DOD, protokoły TCP i UDP, adresy IP, porty, gniazda, operacje na adresach - klasa InetAddress.
Technologie internetowe Wykład 5 Wprowadzenie do skrytpów serwerowych.
Andrzej Majkowski 1 informatyka +. 2 Bezpieczeństwo protokołu HTTP Paweł Perekietka.
Programowanie sieciowe w Javie Michał Kuciapski
Sposoby zdalnego sterowania pulpitem
Programowanie sieciowe w Javie Michał Kuciapski
Model współbieżności w Javie autor: Grzegorz Szuba.
Programowanie sieciowe w Javie Michał Kuciapski
PO13-1 / 19 Wykład 13 Wyjątki i ich zgłaszanie Wyłapywanie wyjątków Obsługa wyjątków Wykorzystanie polimorfizmu Filtrowanie wyjątków Błędy w konstruktorach.
Podstawy informatyki Mechanizm obsługi sytuacji wyjątkowych Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu.
Strumienie w języku Java Bartosz Walter InMoST Wielkopolska sieć współpracy w zakresie innowacyjnych metod wytwarzania oprogramowania Termin realizacji:
Zaawansowane technologie Javy Wykład 4 (16 marca 2017)
Programowanie Obiektowe – Wykład 6
Zaawansowane technologie Javy Wykład 5 (26 marca 2017)
Dzisiejsze zajęcia będą wyjątkowe…
Strumienie, Wczytywanie, Zapisywanie, Operacje na plikach
Wątki, programowanie współbieżne
(według:
(c) Krzysztof Barteczko 2014
Programowanie obiektowe – zastosowanie języka Java SE
Tworzenie wątków w Javie
Zapis prezentacji:

Programowanie sieciowe w Javie Michał Kuciapski

Gniazda

Gniazda klientów

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 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 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 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 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 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(" "); InetAddress zdalny = InetAddress.getByName("bsvc.univ.gda.pl");

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 z 53 Pobieranie informacji z gniazda InetAddress getInetAddress() int getPort() int getLocalPort() InetAddress getLocalAddress()

12 z 53 Pobieranie informacji z gniazda – przykład 1 Dodatkowy kod dla wcześniejszego przykładu String nLokalny = " "; 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 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(" System.out.println(gniazdo.toString()); } catch(UnknownHostException e) { System.err.println(e); } catch(IOException e) { System.err.println(e); } }}

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 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 z 53 Metody związane z pobieraniem danych Dla klasy InputStream - int read() Dla klasy InputStreamReader – int read() Dla klasy BufferedReader – String readLine()

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 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 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 z 53 Pobieranie danych – przykład c.d catch(UnknownHostException e) { System.out.println(e); } catch(IOException e) { System.out.println(e); }

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 z 53 Wysyłanie danych – przykład c.d catch(UnknownHostException e) { System.out.println(e); } catch(IOException e) { System.out.println(e); }

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 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 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 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); }

Gniazda Gniazda serwerów

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 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 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 z 53 Przyjmowanie i zamykanie połączeń Przyjmowanie połączeń – public Socket accept() throws IOException Zamykanie połączeń – public void close() throws IOException

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 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 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( )); } catch (IOException e) { System.out.println("Na porcie " + port + " działa serwer"); }

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

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 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 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 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 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 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 z 53 Metody związane z pobieraniem danych Dla klasy InputStream - int read() Dla klasy InputStreamReader – int read() Dla klasy BufferedReader – String readLine()

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 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 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 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 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 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 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 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/ 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 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 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 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()); }