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