Programowanie sieciowe

Podobne dokumenty
STRUMIENIE DANYCH, SERIALIZACJA OBIEKTÓW

Programowanie współbieżne i rozproszone

Programy typu klient serwer. Programowanie w środowisku rozproszonym. Wykład 5.

Platformy Programistyczne Zagadnienia sieciowe i wątki

Adresy URL. Zaawansowane technologie Javy 2019

Programowanie sieciowe

Wykład 2. Strumienie tekstowe (wprowadzanie danych z klawiatury) i bajtowe, otwieranie strumieni poprzez sieć - obiekty URL

JAVA I SIECI. MATERIAŁY:

Java programowanie sieciowe

Aplikacja wielowątkowa prosty komunikator

URL. Budowa URL (ang. Uniform Resource Locator): working#downloading

Kurs programowania. Wykład 10. Wojciech Macyna. 05 maja 2016

Przykłady interfejsu TCP i UDP w Javie

Programowanie w języku Java

Programowanie rozproszone w języku Java

Strumienie tekstowe (wprowadzanie danych z klawiatury) i bajtowe, otwieranie strumieni przez sieć - obiekty URL

Języki i metody programowania Java INF302W Wykład 4

Komunikacja z użyciem gniazd aplikacje klient-serwer

KOMUNIKACJA MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

STRUMIENIE TEKSTOWE WEJŚCIOWE WPROWADZANIE DANYCH STRUMIENIE BAJTOWE, STRUMIENIE TEKSTOWE

Networking. Zaawansowane technologie Javy 2019

Podstawy i języki programowania

Aplikacje RMI. Budowa aplikacji rozproszonych. Część 2.

Język JAVA podstawy. Wykład 6, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

K O M U N I K A C J A MIĘDZYPROCESOWA O B S Ł U G A WEJŚCIA/WYJŚCIA

Strumienie i serializacja

Obiekty sieciowe - gniazda Komputery w sieci Internet komunikują się ze sobą poprzez:

Zadanie 2: transakcyjny protokół SKJ (2015)

Aplikacja wielow tkowa prosty komunikator

Java a dost p do Internetu.

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Metody zawarte w klasie File: boolean createnewfile() tworzy nowy, pusty plik, ale tylko jeśli on wcześniej nie istniał. boolean delete() usuwa dany

Wykład 7 Tworzenie łącz w apletach, wątki, serializacja obiektów, gniazda

Podstawowe pojł cia. Czego sił nauczymy? Pojł cia hosta. Hosty Adresowanie Internetowe Porty Protokoóy

Java programowanie w sieci. java.net RMI

JAVA. Strumienie wejścia i wyjścia. Pliki - zapis i odczyt

Gniazda komunikacji sieciowej w środowisku Java

Wykład 10: Wejście i Wyjście

Schemat dla UDP. = możliwe zablokowanie aplikacji KLIENT SERWER. s=socket(...) bind(s,...) recvfrom(s,...) sendto(s,...) recvfrom(s,...

Programowanie aplikacji w architekturze Klient-Serwer - UDP

Biblioteki wejścia/wyjścia. Strumienie we/wy (I/O)

Wykład 2: Podstawy Języka

Programowanie obiektowe

Podstawy otwartych języków programowania Wyjątki i strumienie I/O

Strumienie, pliki. Sortowanie. Wyjątki.

sieć 4) Mechanizm RMI jest zazwyczaj wykorzystywany w rozwiązaniach typu klient-serwer.

Przykład. Podaj nazwę domenową hosta a odczytaj jego adres IP, lub odwrotnie:

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Wywoływanie metod zdalnych

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Wykład 4: Wejście/wyjście: strumienie Java

Klient-Serwer Komunikacja przy pomocy gniazd

Programowanie obiektowe

Programowanie obiektowe

Tworzenie aplikacji rozproszonej w Sun RPC

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Wybrane działy Informatyki Stosowanej

Wywoływanie metod zdalnych

Programowanie obiektowe zastosowanie języka Java SE

Programowanie obiektowe

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Gniazda BSD implementacja w C#

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Podejście obiektowe do budowy systemów rozproszonych

Systemy Rozproszone - Ćwiczenie 6

1. Co będzie wynikiem wykonania poniŝszych instrukcji? g2d.gettransform().scale(1, -1); g2d.gettransform().translate(4, -8); g2d.drawline(4, 0, 4, 4);

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Klasy w java.net. ContentHandlerFactory FileNameMap SocketImplFactory URLStreamHandlerFactory. Adres internetowy

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie obiektowe

Sieci komputerowe. Wykład 5: Warstwa transportowa: TCP i UDP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Java niezbędnik programisty spotkanie nr 11. Importy statyczne, wejście/wyjście, wyrażenia regularne, serializacja

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

Remote Method Invocation 17 listopada 2010

Programowanie w Javie Lista nr 1. Wybieramy kategorię Java, a wśród Projektów Java Application i [NEXT]

1 Klasa File. 2 Writer. Programowanie w j zyku Java - Adam Krechowicz. Klasa File zapewnia podstawowe operacje na plikach

Programowanie obiektowe

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

PODEJŚCIE OBIEKTOWE. Przykład 1 metody i atrybuty statyczne

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Ćwiczenie 1. Przygotowanie środowiska JAVA

76.Struktura oprogramowania rozproszonego.

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

akademia androida Składowanie danych część VI

MATERIAŁY POMOCNICZE DO ĆWICZENIA 3 Klasy i obiekty; atrybuty i metody

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Komunikator internetowy w C#

Multimedia JAVA. Historia

Inynieria oprogramowania Lecture XXX. Java TM cz IV: IO. Bartosz Walter

Transkrypt:

Programowanie sieciowe Wykład 4: Java sieciowa mgr inŝ. Paweł Kośla mgr Marcin Raniszewski Łódź, 2009 1

Plan wykładu Przegląd java.net InetAddress URL Socket klient TCP ServerSocket serwer TCP 2

Literatura dodatkowa Opis klas z pakietu java.net klasy uŝyteczne w programowaniu sieciowym: http://java.sun.com/j2se/1.5.0/docs/api/java/net/package-summary.html 3

Wprowadzenie Tworzenie programów działających w sieciach było głównym powodem powstania języka Java. Java dostarcza wiele mechanizmów wysokiego poziomu do programowania sieciowego. Podstawowe klasy połączeń (adresowania): InetAddress, URL oraz pochodne URL Do programowania połączeń opartych na protokole TCP: Socket ServerSocket Opartych na UDP: DatagramSocket DatagramPacket Wiele innych klas, interfejsów, oraz wyjątków. 4

Klasa InetAddress Opisuje adres komputera w sieci poprzez: Nazwę/domenę np. www.p.lodz.pl Numer IP, np. 212.51.207.68 WaŜniejszy jest numer IP, w przypadku uŝywania nazwy - tłumaczona ona jest na adres IP. Wybrane metody: public static InetAddress getbyname(string host) throws UnknownHostException public static InetAddress getbyaddress(byte[] addr) throws UnknownHostException public static InetAddress[] getallbyname(string host) throws UnknownHostException public static InetAddress getlocalhost() throws UnknownHostException public boolean ismulticastaddress() public boolean issitelocaladdress() public String gethostname() public byte[] getaddress() public String gethostaddress() public int hashcode() public boolean equals(object obj) public String tostring() 5

Klasa InetAddress Brak publicznych konstruktorów. Do tworzenia nowych obiektów uŝywamy metod statycznych. NaleŜy zapewnić obsługę wyjątku UnknownHostException, który powstaje w przypadku braku identyfikacji komputera o podanej nazwie lub adresie. Aby stworzyć obiekt przechowujący adres komputera wykorzystujemy metodę getbyname(string host) try { InetAddress zly = InetAddress.getByName("zly.kis.p.lodz.pl"); InetAddress poli = InetAddress.getByName("212.51.207.68"); catch (UnknownHostException e) { System.err.println(e); 6

Klasa InetAddress Lub metodę getbyaddress(byte[] addr), przyjmującą adres IP w postaci tablicy, a nie w postaci łańcucha znaków jak poprzednio try { byte ip[] = {(byte)212, (byte)51, (byte)207, (byte)68; InetAddress poli = InetAddress.getByAddress(ip); catch (UnknownHostException e) { System.err.println(e); 7

Klasa InetAddress Niektóre hosty (te, które maja wiele kart sieciowych) pod jedna nazwą mogą mieć wiele adresów IP. Tablicę obiektów reprezentujących adresy hosta uzyskujemy dzięki metodzie getallbyname(string host) try { InetAddress[] addresses = InetAddress.getAllByName("dom1"); for (int i = 0; i < addresses.length; i++) { System.out.println(addresses[i]); catch (UnknownHostException e) { System.out.println(e); dom1/192.168.0.2 dom1/192.168.75.1 dom1/192.168.66.1 8

Klasa InetAddress Do stworzenia obiektu reprezentującego adres komputera lokalnego, na którym uruchomiony zostaje program słuŝy metoda getlocalhost() try { InetAddress me = InetAddress.getLocalHost(); System.out.println(me); catch (UnknownHostException e) { System.err.println(e); dom1/192.168.0.2 9

Klasa InetAddress Z obiektu klasy InetAddress moŝemy "wyciągnąć" informacje o hoście Metoda tostring() formatuje informacje do łańcucha znaków w sposób: "nazwa hosta" / "numer IP" Wywoływana automatycznie przy metodzie System.out.println() InetAddress me = InetAddress.getLocalHost(); System.out.println(me); System.out.println(me.toString()); //to samo dom1/192.168.0.2 dom1/192.168.0.2 MoŜna pobrać takŝe nazwę hosta w postaci ciągu znaków, adres IP jako ciąg znaków oraz adres IP jako tablicę bajtów. SłuŜą do tego kolejno: public String gethostname() public byte[] getaddress() public String gethostaddress() 10

Klasa InetAddress Informacje o obiekcie klasy InetAddress try { InetAddress poli = InetAddress.getByName("212.51.207.68"); System.out.println("Nazwa hosta: " + poli.gethostname()); System.out.println("Numer IP: " + poli.gethostaddress()); byte[] address = poli.getaddress(); for (int i = 0; i < address.length; i++) { System.out.print((int)(address[i]&0xFF) + "."); System.out.println(); catch (UnknownHostException e) { Nazwa hosta: ck.p.lodz.pl System.err.println(e); Numer IP: 212.51.207.68 212.51.207.68. 11

Klasa InetAddress Do sprawdzenia czy adres jest adresem grupowym (z klasy D) słuŝy metoda ismulticastaddress() InetAddress hst = InetAddress.getByName("224.0.0.0"); System.out.println(hst.isMulticastAddress()); true Czy obiekt klasy InetAddress zawiera adres lokalny (prywatny) sprawdzamy metodą issitelocaladdress() InetAddress hst = InetAddress.getByName("10.0.0.1"); System.out.println(me.isSiteLocalAddress()); true 12

Klasa URL Inną klasą wykorzystywaną w Javie do adresowania komputerów jest klasa URL oraz jej pochodne URLClassLoader, URLConnection, URLDecoder, URLEncoder, URLStreamHandler. URL jest skrótem od "Uniform Resource Locator", pozwalającym identyfikować lokalizację zasobów w Internecie. Tworząc obiekt klasy URL otrzymujemy gotowy wskaźnik, który jest wykorzystywany przez liczne metody Javy (np. otwieranie obrazka getimage(), tworzenie połączenia w JDBC - Connection). 13

Klasa URL Pełny URL składa się z pięciu fragmentów, choć nie wszystkie one są wymagane: protokół host port plik identyfikator fragmentu (np. ref, section, anchor) ciąg zapytania (query) Przykładowe URL: http://www.javasoft.com/ http://www.google.pl/search?hl=pl&q=java&lr= file://dom1/ps/wyklad/ps5.ppt http://www.kis.p.lodz.pl:80/katedra/index.html ftp://ftp.info.apple.com/pub/ mailto:pkosla@kis.p.lodz.pl telnet://cyberspace.org 14

Klasa URL Istnieją konstruktory, które pozwalają tworzyć URL na podstawie róŝnych fragmentów, jak równieŝ metody do parsowania róŝnych części URL. Metody, które na podstawie URL pozwalają uzyskać InputStream, za pośrednictwem którego moŝna pozyskiwać dane z serwera. Klasa URL hermetyzuje cały ten proces, dzięki czemu uŝytkownik nie musi zajmować się problemami związanymi z obsługą protokołu czyta tylko ze strumienia. Kiedy tworzony jest obiekt URL, Java szuka obsługi protokołu, która rozumie część deklaracji URL dotyczącą protokołu, jak "http" lub "mailto". Jeśli Ŝadna obsługa nie zostanie znaleziona, konstruktor zwraca wyjątek MalformedURLException Rozpoznawane protokoły: - file, ftp, http, - gopher, mailto, - appletresource, doc, netdoc, systemresource, verbatim (stworzone przez Sun, uŝywane wewnętrznie w JDK) Uwaga: większe moŝliwości od klasy java.net.url ma klasa java.net.urlconnection. 15

Klasa URL tworzenie Istnieje kilka konstruktorów m.in.: public URL(String u) throws MalformedURLException public URL(String protocol, String host, String file) throws MalformedURLException public URL(String protocol, String host, int port, String file) throws MalformedURLException public URL(URL context, String u) throws MalformedURLException Mając pełny URL, typu: http://www.kis.p.lodz.pl/katedra/index.html moŝna utworzyć odpowiadający mu obiekt: try { URL u = new URL("http://www.kis.p.lodz.pl/katedra/index.html"); catch (MalformedURLException e) { 16

Klasa URL tworzenie MoŜna teŝ utworzyć URL przekazując części ciągu do konstruktora: try{ URL u = new URL("http","www.kis.p.lodz.pl","/katedra/index.html"); catch (MalformedURLException e){ Zazwyczaj nie definiuje się portu dla URL, gdyŝ większość protokołów uŝywa portów domyślnych (http - port 80). Jeśli jest taka potrzeba: try{ URL u = new URL("http","www.kis.p.lodz.pl",80,"/katedra/index.html"); catch (MalformedURLException e){ 17

Klasa URL tworzenie Wiele plików HTML zawiera URL zdefiniowany relatywnie (są przydatne przy tworzeniu "mobilnych" stron) Relatywne odnośniki dziedziczą host, port, protokół oraz czasem katalog bieŝący strony. Link teach.html na stronie http://www.kis.p.lodz.pl/katedra/pl/staff.html będzie odnośnikiem do http://www.kis.p.lodz.pl/katedra/pl/teach.html Do tworzenia relatywnych URL przy danym bezwzględnym URL słuŝy konstruktor: try { URL u1 = new URL("http://www.kis.p.lodz.pl/katedra/pl/staff.html"); URL u2 = new URL(u1, "teach.html"); catch (MalformedURLException e) { 18

Klasa URL parsowanie Dostępne są metody do wyłuskania poszczególnych składowych URL: public String getprotocol() public String gethost() public int getport() public int getdefaultport() public String getfile() public String getpath() public String getref() public String getquery() Jeśli port nie jest jawnie wyspecyfikowany w URL, to jest on ustawiany na wartość -1. (uŝyty zostanie port domyślny) Jeśli ref lub query nie istnieje, to zwraca null 19

Klasa URL parsowanie Przykład: try { URL u = new URL("http://www.google.pl/search?hl=pl&q=java&lr=#top"); System.out.println("protocol: " + u.getprotocol()); System.out.println("host: " + u.gethost()); System.out.println("port: " + u.getport()); System.out.println("defaultport: " + u.getdefaultport()); System.out.println("file: " + u.getfile()); System.out.println("path: " + u.getpath()); System.out.println("ref: " + u.getref()); System.out.println("query: " + u.getquery()); catch (MalformedURLException ex) { protocol: http host: www.google.pl port: -1 defaultport: 80 file: /search?hl=pl&q=java&lr= path: /search ref: top query: hl=pl&q=java&lr= 20

Klasa URL odczyt danych Do otwarcia połączenia z serwerem wyspecyfikowanym w URL oraz utworzenia strumienia InputStream zasilanego danymi z tego połączenia słuŝy metoda : public final InputStream openstream() throws IOException Dane z serwera ściąga się poprzez otwarty strumień. Strumień zawiera tylko czyste, surowe dane (nie przejmujemy się nagłówkami pakietów) Aby odczytać coś ze strumienia korzysta się z metod klas z pakiety java.io. Istotnym jest buforowanie, przez BufferedInputStream lub BufferedReader. 21

Klasa URL odczyt danych Przykład kodu wyświetlającego wskazaną stronę www na konsoli: try{ URL u = new URL("http://pkosla.kis.p.lodz.pl"); InputStream is = u.openstream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String theline; while ((theline = br.readline())!= null) { System.out.println(theLine); catch (MalformedURLException e){ System.err.println(e); catch (IOException e){ System.err.println(e); <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <!-- saved from url=(0033)http://www.kis.p.lodz.pl/~pkosla/ --> <HTML><HEAD><TITLE>Pawel Kosla KIS</TITLE> <META http-equiv=content-type content="text/html; charset=iso-8859-2"> <META http-equiv=content-language content=pl>... 22

Klient TCP Gniazda klienckie pozwalają na wykonywanie operacji otwierania połączeń z odległymi komputerami, wysyłania i odbierania danych oraz zamykania połączeń. Klasa Socket wysoki poziom programowania. Przesył danych strumieniowych. Dwukierunkowa łączność: sekwencyjnie read write read write read write read write blokowo read read read write write write read read wątki read write read write read write read write write read write Host 1 Host 1 23

Klient TCP Schemat blokowy aplikacji: open Socket() connect read write open tworzy gniazdo klienckie connect łączy stworzone gniazdo ze zdalnym hostem (zdalnym gniazdem) read pobiera dane ze strumienia otwartego połączenia write wysyła dane close zamyka połączenie close 24

Klient TCP Modyfikacje schematu: open connect open connect read write wątek read write wątek close close synchroniczny transfer asynchroniczny transfer 25

Klient TCP nawiązywanie połączeń Do nawiązywania połączenia ze zdalnym hostem słuŝy konstruktor gniazda. KaŜdy obiekt typu Socket jest związany dokładnie z jednym zdalnym hostem. Aby połączyć się z innym hostem, naleŝy utworzyć nowy obiekt typu Socket. Aby utworzyć obiekt typu Socket naleŝy co najmniej wyspecyfikować zdalnego hosta oraz numer portu, z którym chce się utworzyć połączenie. w postaci nazwy hosta: public Socket(String host, int port) throws UnknownHostException, IOException lub obiektu InetAddress: public Socket(InetAddress address, int port) throws IOException 26

Klient TCP nawiązywanie połączeń W przypadku wielu lokalnych adresów moŝemy wskazać takŝe z którego będziemy się łączyć. public Socket(String host, int port, InetAddress localaddr, int localport) throws IOException public Socket(InetAddress address, int port, InetAddress localaddr, int localport) throws IOException Wskazać moŝemy takŝe numer portu z którego będziemy się łączyć tradycyjnie numer ten przydzielany jest dynamicznie >1024 (poprzednie konstruktory) NaleŜy uwaŝać, w danej chwili na jednym porcie moŝe być realizowane tylko jedno połączenie. Dynamiczne wybieranie wolnego portu przez system realizujemy przez wartość portu 0. Przykład: Socket("zly.kis.p.lodz.pl", 21, "192.168.0.2", 0); 27

Klient TCP nawiązywanie połączeń Prosty program nawiązujący połączenie ze zdalnym hostem. import java.net.*; import java.io.*; /** * Przyklad klienta nawiazujacego polaczenie sieciowe TCP */ public class Klient { public static void main(string[] args) { try { Socket gniazdo = new Socket("zly.kis.p.lodz.pl", 21); System.out.println("Nawiazano polaczenie"); gniazdo.close(); catch(ioexception e){ System.out.println("Podczas proby nawiazania polaczenia wystapil blad" + e); 28

Klient TCP nawiązywanie połączeń Konstruktory mogą zwrócić wyjątki, konieczne jest zapewnienie ich obsługi. Ogólnie jest to klasa wyjątków IOException Przydatne są bardziej szczegółowe informacje niŝ te które dostarcza IOException. Do dyspozycji mamy klasę wyjątków związanych z gniazdem SocketException, która zawiera: ConnectException połączenie odrzucone, np. Ŝaden proces nie nasłuchuje na danym porcie na zdalnym hoście NoRouteToHostException host niedostępny, np. jest za firewallem PortUnreachableException nieosiągalny port W przypadku konstruktorów z hostem identyfikowanym jako String naleŝy dodatkowo obsłuŝyć wyjątek UnknownHostException (niejawnie wywołana metoda gethostbyname() ) 29

Klient TCP nawiązywanie połączeń Szczegółowa obsługa wyjątków: try { Socket gniazdo = new Socket("zly.kis.p.lodz.pl", 21); System.out.println("Nawiazano polaczenie"); gniazdo.close(); catch(unknownhostexception e){ System.out.println("komputer nie jest znany"); catch(noroutetohostexception e){ System.out.println("komputer jest niedostepny"); catch(connectexception e){ System.out.println("komputer odrzucil polaczenie"); catch(ioexception e){ System.out.println("Podczas proby nawiazania polaczenia wystapil blad" + e); 30

Klient TCP info o połączeniu gniazdo lokalne gniazdo zdalne Obiekt klasy Socket dostarcza informacji o gnieździe lokalnym i zdalnym Obiekt InetAddress do którego się podłączyliśmy i z którego się łączymy moŝemy pobrać metodami: public InetAddress public InetAddress getinetaddress() getlocaladdress() Numery portów połączenia na zdalnym i lokalnym gnieździe: public int public int getport() getlocalport() getlocalport() przydatne do sprawdzenia który port został dynamicznie wybrany przez klienta. Metoda tostring() zwraca informacje o gnieździe w postaci łańcucha znakowego, np.: Socket[addr=zly.kis.p.lodz.pl/212.191.89.2,port=21,localport=1116] 31

Klient TCP info o połączeniu Odczyt informacji o gnieździe try { Socket gniazdo = new Socket("zly.kis.p.lodz.pl", 21); System.out.println("Nawiazano polaczenie"); System.out.println(gniazdo); System.out.println("Dynamicznie wybrany port lokalny: " + gniazdo.getlocalport()); gniazdo.close(); catch(ioexception e){ System.out.println("Podczas proby nawiazania polaczenia wystapil blad" + e); Nawiazano polaczenie Socket[addr=zly.kis.p.lodz.pl/212.191.89.2,port=21,localport=1115] Dynamicznie wybrany port lokalny: 1115 32

Klient TCP skaner portów Nie moŝna połączyć się ze zdalnym hostem na dowolnym porcie. Aby połączenie doszło do skutku zdalny host musi nasłuchiwać na danym porcie. Do określenia, na którym porcie zdalny host nasłuchuje moŝna wykorzystać konstruktor Socket import java.net.*; import java.io.*; public class Klient { public static void main(string[] args) { for (int port = 0; port < 65536; port++) { try { Socket s = new Socket("localhost", port); System.out.println("Serwer ma otwarty port: " + port); s.close(); catch (IOException e) { System.out.println("zamkniety port: " + port); Uwaga: Skanowanie portów moŝe być zinterpretowane jako próba ataku na zdalny serwer. 33

Klient TCP odczyt i zapis danych Po nawiązaniu połączenia przesyłamy i odbieramy dane Metody odbierające dane są metodami blokującymi (czekają aŝ pojawią się dane w strumieniu) Rodzaje danych: - tekstowe - binarne - dane serializowane (obiekty) Obiekty InputStream, OutputStream reprezentują strumienie wejściowe i wyjściowe połączenia sieciowego. Do wydobycia tych strumieni słuŝą metody klasy Socket: public InputStream getinputstream() throws IOException public OutputStream getoutputstream() throws IOException 34

Klient TCP dane tekstowe Analogia do czytania z plików, z klawiatury, z URL. Przejście ze strumienia do treści przesyłanej za pomocą klas konwertujących. InputStream is = gniazdo.getinputstream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); InputStreamReader - strumień przekształcający bajtowy strumień w strumień znaków BufferedReader - strumień buforujący dane i umoŝliwiający czytanie danych porcjami. W przypadku klawiatury: InputStream is = System.in; 35

Klient TCP dane tekstowe Klasa BufferedReader udostępnia następujące metody wczytujące: public int read() throws IOException Czyta pojedynczy znak ze strumienia. Zwraca go w postaci int. W przypadku napotkania końca strumienia zwraca -1. public int read(char[] cbuf, int off, int len) throws IOException Wczytuje porcje znaków (len) do tablicy (cbuf) z określonego miejsca ze strumienia (off). Zwraca ilość wczytanych znaków lub -1 w przypadku końca strumeinia public String readline() throws IOException Wczytuje linię tekstu zakończoną '\n' lub '\r' 36

Klient TCP dane tekstowe,daytime Zastosowanie do usługi DayTime. Serwer czasu, po połączeniu się z nim na porcie 13 wysyła datę w postaci łańcucha znaków. Usługę udostępniają np. vega.cbk.poznan.pl lub ntp.task.gda.pl Data podawana jest w postaci: Sat Mar 8 14:47:28 2008 37

Klient TCP dane tekstowe,daytime import java.net.*; import java.io.*; public class DayTime{ public static void main(string[] args) { String hostname; if(args.length == 0) hostname = "localhost"; else hostname = args[0]; try{ Socket gniazdo = new Socket(hostName,13); InputStream is = gniazdo.getinputstream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String czas = br.readline(); System.out.println("czas na komputerze " + hostname + " to " + czas); catch(ioexception e){ System.out.println(e); >java DayTime vega.cbk.poznan.pl czas na komputerze vega.cbk.poznan.pl to Thu Mar 4 14:53:32 2008 38

Klient TCP dane tekstowe Zapis danych następuje podobnie. OutpuStream os = gniazdo.getoutputstream(); PrintWriter pw = new PrintWriter(os, true); Klasa PrintWriter udostępnia metodę zapisu print(...) przyjmującą argumenty w postaci liczb lub łańcuchów String. PoniewaŜ println(...) w tym przypadku nie dodaje znaczników końca wiersza, musimy sami się tym zaopiekować: pw.print("tekst" + "\r\n"); MoŜemy takŝe pisać bezpośrednio do obiektu OutputStream. Dostępne mamy tam metody: public void write(byte[] b) throws IOException Zapisuje b.length bajtów z tablicy bajtowej do strumienia wyjściowego. public void write(byte[] b, int off, int len) throws IOException Zapisuje len bajtów z tablicy bajtowej, zaczynając od pozycji off do strumienia wyjściowego. 39

Klient TCP dane tekstowe, echo Podstawa echo import java.net.*; import java.io.*; public class Start{ String msg = "to jest wiadomosc"; public static void main(string[] args) { Start me = new Start(); me.echo("localhost"); public void echo(string host){ try{ Socket sock = new Socket(host, 7); BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream())); PrintWriter out = new PrintWriter(sock.getOutputStream()); out.print(msg + "\r\n"); out.flush(); String reply = in.readline(); System.out.println("wyslano \"" + msg + "\""); System.out.println("odebrano \"" + reply + "\""); sock.close(); catch(ioexception e){ System.out.println("Blad "+e); flush() powoduje wysłanie zawartości bufora w sieć!! 40

Klient TCP dane binarne Jeśli chcemy przekazywać dane binarne musimy utworzyć obiekty klas DataInputStream oraz DataOutputStream. Najprostszy sposób: DataInputStream in = new DataInputStream(gniazdo.getInputStream()); DataOutputStream out = new DataOutputStream(gniazdo.getOutputStream()); Jeśli ilość danych przekazywanych moŝe być duŝa, warto wykorzystać strumienie buforowane: DataInputStream in = new DataInputStream( new BufferedInputStream(gniazdo.getInputStream())); DataOutputStream out = new DataOutputStream( new BufferedOutputStream(gniazdo.getOutputStream())); 41

Klient TCP dane binarne Wśród metod powyŝszych klas są następujące: public final boolean readboolean() throws IOException public final byte readbyte() throws IOException public final int readunsignedbyte() throws IOException! public final short readshort() throws IOException public final int readunsignedshort() throws IOException! public final char readchar() throws IOException public final int readint() throws IOException public final long readlong() throws IOException public final float readfloat() throws IOException public final double readdouble() throws IOException public final void writeboolean(boolean v) throws IOException public final void writebyte(int v) throws IOException! public final void writeshort(int v) throws IOException! public final void writechar(int v) throws IOException! public final void writeint(int v) throws IOException public final void writelong(long v) throws IOException public final void writefloat(float v) throws IOException public final void writedouble(double v) throws IOException 42

Klient TCP dane binarne Fragment kodu programu odbierającego liczbę int z hosta zdalnego Serwer po połączeniu wysyła liczbę int. try{ Socket sock = new Socket("192.168.0.2",10); DataInputStream in = new DataInputStream( new BufferedInputStream(sock.getInputStream())); int liczba = in.readint(); System.out.println("odebralem liczbe: " + liczba); sock.close(); catch(ioexception e){ System.out.println("Blad "+e); 43

Klient TCP dane serializowane Serializacja obiektów to moŝliwość skonwertowania obiektów przechowywanych w pamięci komputera do zewnętrznej postaci, którą moŝna wysłać w sposób szeregowy. Jeśli chcemy przekazywać obiekty musimy utworzyć obiekty klas ObjectInputStream oraz ObjectOutputStream. Analogicznie jak poprzednio: Socket gniazdo = new Socket("195.117.215.1",1050); ObjectInputStream in = new ObjectInputStream( new BufferedInputStream(gniazdo.getInputStream())); ObjectOutputStream out = new ObjectOutputStream( new BufferedOutputStream(gniazdo.getOutputStream())); NajwaŜniejszymi metodami tych klas są odpowiednio: public final Object readobject() throws IOException, ClassNotFoundException public final void writeobject(object obj) throws IOException Klasy te mają takŝe metody znane z obsługi danych binarnych. readint(), writefloat(float v)... 44

Klient TCP dane serializowane Przykład klienta TCP odbierającego obiekt klasy Date Serwer wysyła obiekt klasy Date zawierający aktualna datę serwera import java.net.*; import java.io.*; import java.util.*; public class Klient { public static void main(string[] args) { try{ Socket sock = new Socket("192.168.0.2",10); ObjectInputStream in = new ObjectInputStream( new BufferedInputStream(sock.getInputStream())); Object ob = in.readobject(); if(ob == null) { System.out.println("Serwer przeslal null"); else if (ob instanceof Date) { Date d = (Date)ob; System.out.println("data: " + d); else{ throw new ClassNotFoundException("oczekiwano daty, odebrano obiekt klasy "+ob); sock.close(); catch(classnotfoundexception e) { System.out.println(e); catch(ioexception e) { System.out.println("Blad "+e); data: Thu Mar 16 18:25:10 CET 2006 45

Klient TCP - podsumowanie Aby mieć moŝliwość wysyłania i odbierania danych najpierw naleŝy połączyć się ze zdalnym hostem (serwerem). Dane przesyłamy strumieniowo. MoŜna przesyłać łańcuchy tekstowe, dane binarne (np. liczby) oraz obiekty. Dane przesyłane będą wiarygodnie. 46