Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
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()); }
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.