Serwer współbieżny połączeniowy



Podobne dokumenty
Podstawowe typy serwerów

Podstawowe typy serwerów

Serwery współbieżne c.d.

Przykłady interfejsu TCP i UDP w Javie

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

JAVA I SIECI. MATERIAŁY:

Aplikacja wielowątkowa prosty komunikator

Klient-Serwer Komunikacja przy pomocy gniazd

Aplikacja wielow tkowa prosty komunikator

Komunikacja z użyciem gniazd aplikacje klient-serwer

Programowanie współbieżne i rozproszone

Architektura typu klient serwer: przesyłanie pliku tekstowo oraz logowania do serwera za pomocą szyfrowanego hasła

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

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Model OSI/ISO. Komputer B. Warstwy w modelu OSI aplikacji. aplikacji. prezentacji Komputer A. prezentacji. sesji. sesji. komunikacja wirtualna

Programowanie w języku Java

Programowanie sieciowe

5. Algorytmy serwera

Iteracyjny serwer TCP i aplikacja UDP

Zwielokrotnianie wejścia wyjścia

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

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

Platformy Programistyczne Zagadnienia sieciowe i wątki

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Sieci komputerowe. Wykład 7: Transport: protokół TCP. Marcin Bieńkowski. Instytut Informatyki Uniwersytet Wrocławski

Tworzenie i wykorzystanie usług

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

Komunikacja międzyprocesowa. Krzysztof Banaś Systemy rozproszone 1

Zadanie 2: transakcyjny protokół SKJ (2015)

1. Co można powiedzieć o poniższym kodzie? public interface I { void m1() {}; static public void m2() {}; void abstract m3();

Gniazda komunikacji sieciowej w środowisku Java

1. Co można powiedzieć o poniższym kodzie (zakładając, że znajduje się on w jednym pliku A.java)?

Java programowanie w sieci. java.net RMI

Programowanie sieciowe

Gniazda BSD. komunikacja bezpołączeniowa

Programowanie rozproszone w języku Java

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Wybrane działy Informatyki Stosowanej

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

Podstawy i języki programowania

Programowanie aplikacji w architekturze Klient-Serwer - UDP

package pakieta; import pakietb.b; package pakietb; public class B { B(){} public class A { private B b; A(B b) { this.b = b; } }

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

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

Gniazda BSD. Procesy w środowisku sieciowym. Gniazda podstawowe funkcje dla serwera. Gniazda podstawowe funkcje dla klienta

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

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Java. Programowanie Obiektowe Mateusz Cicheński

Gniazda BSD implementacja w C#

Gniazda UDP. Bartłomiej Świercz. Łódź, 3 kwietnia Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda UDP

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

Programowanie obiektowe

Algorytmy z powrotami. Algorytm minimax

Programowanie współbieżne Laboratorium nr 11

Aplikacje w środowisku Java

Współbieżność w środowisku Java

RESTful Android. Na co zwrócić uwagę przy tworzeniu aplikacji klienckich REST na Androidzie

Zaawansowane aplikacje WWW - laboratorium

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

Gniazda. S. Samolej: Gniazda 1

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Programowanie z wykorzystaniem gniazd

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Aplikacje w Javie- wykład 11 Wątki-podstawy

Programowanie obiektowe

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

Programowanie przy użyciu gniazdek

KLASY, INTERFEJSY, ITP

Systemy Rozproszone - Ćwiczenie 6

Aplikacje internetowe i rozproszone - laboratorium

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

Wywoływanie metod zdalnych

Programowanie obiektowe

akademia androida Składowanie danych część VI

Programowanie Sieciowe 1

Networking. Zaawansowane technologie Javy 2019

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

Instytut Teleinformatyki

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Mechanizmy pracy równoległej. Jarosław Kuchta

Java a dost p do Internetu.

Łukasz Przywarty Wrocław, r. Grupa: WT/N 11:15-14:00. Sprawozdanie z zajęć laboratoryjnych: OpenSSL - API

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

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

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Stanowe komponenty sesyjne

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

1. Co można powiedzieć o poniższym kodzie (zakładając, że zaimportowano wszystkie niezbędne klasy)?

Ćwiczenie 9 - Zaawansowane metody programowania w sieci komputerowej

Podejście obiektowe do budowy systemów rozproszonych

Komunikacja sieciowa - interfejs gniazd

Materiały do zajęć III

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

Transkrypt:

Serwery współbieżne 1. Serwery współbieżne serwery połączeniowe, usuwanie zakończonych procesów, serwery bezpołączeniowe, 2. Jednoprocesowe serwery współbieżne. koncepcja i implementacja. 1

Serwer współbieżny Zasadniczym powodem stosowania mechanizmu współbieżności w serwerach jest potrzeba zapewnienia krótkiego czasu odpowiedzi w warunkach obsługi wielu klientów. Współbieżność skraca obserwowany czas odpowiedzi gdy: przygotowanie odpowiedzi wymaga czasochłonnych operacji wejścia wyjścia, występują znaczne różnice czasu przetwarzania dla różnych zgłoszeń, serwer działa na komputerze wieloprocesorowym. Wyższa wydajność jest uzyskiwana zwykle przez zrównoleglenie przetwarzania danych z operacjami wejścia wyjścia. 2

Serwer współbieżny połączeniowy Proces główny: 1. Utwórz gniazdo i zwiąż je z powszechnie znanym adresem odpowiadającym usłudze udostępnionej przez serwer bind(). 2. Ustaw bierny tryb pracy gniazda listen(). 3. Przyjmij zgłoszenie połączenia nadesłane na adres gniazda - accept(). Utwórz nowy proces podporządkowany fork() odpowiedzialny za obsługę tego połączenia. 4. Wróć do kroku 3. 3

Serwer współbieżny połączeniowy Proces podporządkowany: 1. Przejmij od procesu głównego nawiązane połączenie. 2. Korzystając z otrzymanego gniazda prowadź interakcję z klientem zgodnie z protokołem warstwy aplikacji read(), write(). 3. Zwolnij gniazdo close() i zakończ działanie exit(). Współbieżność w działaniu serwerów typu połączeniowego polega na zrównolegleniu obsługi wielu połączeń, a nie poszczególnych zapytań. 4

Serwer współbieżny połączeniowy Schemat struktury współbieżnego serwera połączeniowego. proces główny gniazdo pierwotne proces potomny 1 proces potomny 2... proces potomny n gniazdo gniazdo gniazdo Proces główny przyjmuje zgłoszenia połączeń. Do obsługi każdego połączenia tworzony jest proces podporządkowany. 5

Usuwanie procesów po ich zakończeniu Procesy potomne po obsłużeniu klienta kończą pracę. W systemach UNIX powinny one dodatkowo zostać zakończone przez proces macierzysty. W przeciwnym razie będą nadal egzystować w systemie. W chwili zakończenia procesu potomnego proces macierzysty otrzymuje sygnał SIGCHILD. Dzięki temu może on zakończyć proces potomny używając instrukcji signal(sigchild, gc); gdzie gc jest wskaźnikiem do przykładowej funkcji: void gc(int i){ while(waitpid(-1, NULL, WNOHANG)<=0) ; 6

Serwer współbieżny połączeniowy svr_con_echo_tcp(){ int s1, s2, alen; struct sockaddr_in sin; if((s1=passivesock(testport, "tcp", 10))<0){ fprintf(stderr, "passivesock: %s\n", strerror(errno)); return -1; signal(sigchld, gc); while(1){ alen = sizeof(sin); if((s2=accept(s1, (struct sockaddr *)&sin, &alen))<0){ if(errno==eintr){ continue; fprintf(stderr, "accept: %s\n", strerror(errno)); return -1; 7

Serwer współbieżny połączeniowy switch(fork()){ case 0: // proces potomny close(s1); echod(s2); if (close(s2)<0){ fprintf(stderr, "close: %s\n", strerror(errno)); return -1; exit(1); default: // proces macierzysty close(s2); break; case -1: fprintf(stderr, "fork: %s\n", strerror(errno)); return -1; // switch 8

Serwer współbieżny połączeniowy Współbieżne serwery połączeniowe jednocześnie komunikują się z wieloma klientami. W zaprezentowanym przykładzie proces główny tworzy nowy proces podporządkowany dla każdego zgłoszonego połączenia. Proces potomny obsługuje klienta po czym zamyka połączenie i kończy działanie. Proces główny bezpośrednio nie kontaktuje się z klientami. 9

Serwer współbieżny bezpołączeniowy Proces główny 1. Utwórz gniazdo i zwiąż je z powszechnie znanym adresem odpowiadającym usłudze udostępnionej przez serwer - bind(). 2. Ustaw bierny tryb pracy gniazda - listen(). 3. Odbierz kolejne zapytanie od klientów - recvfrom(). Utwórz nowy proces podporządkowany fork(), który przygotuje odpowiedź. 4. Przejdź do punktu 3. 10

Serwer współbieżny bezpołączeniowy Proces podporządkowany: 1. Przejmij od procesu głównego dostęp do gniazda. 2. Skonstruuj odpowiedź zgodnie z używanym protokołem i wyślij ją do klienta sendto(). 3. Zakończ działanie exit(). Z powodu znacznego kosztu operacji tworzenia nowego procesu istnieje niewiele współbieżnych realizacji serwerów bezpołączeniowych. 11

Serwer współbieżny bezpołączeniowy import java.io.ioexception; import java.net.datagrampacket; import java.net.datagramsocket; import java.net.inetaddress; public class EchoConcurentUDPServer { private static final int LINELEN = 100; public static void main(string[] args) { if (args.length<1){ System.out.println( "wywolanie java EchoConcurentUDPServer port"); return; DatagramPacket p; DatagramSocket s=null; 12

Serwer współbieżny bezpołączeniowy try { s = new DatagramSocket(Integer.parseInt(args[0])); while(true){ p = new DatagramPacket(new byte[linelen], LINELEN); s.receive(p); Thread t = new Thread(new Worker(s,p)); t.start(); System.out.println("otrzymano :" + new String(p.getData(), 0, p.getlength())); catch (Exception e) { e.printstacktrace(); finally { if (s!=null){ s.close(); 13

Serwer współbieżny bezpołączeniowy private static class Worker implements Runnable{ private DatagramPacket request; private DatagramSocket socket; /** * Konstruktor * @param ds gniazdo uzywane do transmisji * @param dp pakiet zawierający żądanie obsługi */ public Worker(DatagramSocket ds, DatagramPacket dp){ this.socket = ds; this.request = dp; 14

Serwer współbieżny bezpołączeniowy public void run() { byte[] ba = this.request.getdata(); int length = this.request.getlength(); InetAddress ia = this.request.getaddress(); int port = this.request.getport(); DatagramPacket response = new DatagramPacket(ba, 0, length, ia, port); try { this.socket.send(response); System.out.println("wyslano :" + new String(response.getData(), 0, response.getlength())); catch (IOException e) { e.printstacktrace(); 15

Pozorna współbieżność w jednym procesie 1. Utwórz gniazdo i zwiąż je z powszechnie znanym adresem odpowiadającym usłudze udostępnionej przez serwer bind() oraz listen(). 2. Czekaj na zdarzenia dotyczące istniejących gniazd. 3. W razie gotowości pierwotnie utworzonego gniazda przyjmij zgłoszenie połączenia nadesłane na adres gniazda - accept(). Dodaj nowe gniazdo do listy obsługiwanych gniazd. 4. W razie gotowości innego gniazda używaj funkcji read() oraz write() w celu komunikacji z wcześniej połączonym klientem. 5. Wróć do punktu 2. 16

Pozorna współbieżność w jednym procesie Pozorna współbieżność może być stosowana jeśli: korzyści z rzeczywistej współbieżności są mniejsze niż koszt tworzenia nowego procesu, kilka połączeń jest obsługiwane z wykorzystaniem wspólnego zbioru danych, dane są przekazywane pomiędzy niezależnymi połączeniami. Przykład: X-Windows. 17

Jednoprocesowe serwery współbieżne Schemat struktury współbieżnego serwera połączeniowego. proces główny gniazdo pierwotne gniazdo gniazdo... gniazdo Proces główny przyjmuje zgłoszenia połączeń; do obsługi każdego połączenia tworzony wykorzystywane jest osobne gniazdo. 18

Sprawdzenie stanu gniazd W celu wybrania gniazda, do którego przyszedł komunikat można użyć funkcji select() zadeklarowanej w pliku unistd.h: int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); readfds, writefds, exceptfds zbiory obserwowanych deskryptorów ze względu na gotowość do odczytu, zapisu oraz wystąpienia wyjątków. Po wykonaniu funkcji wskaźniki zostaną wypełnione zbiorami deskryptorów, dla których zaszło odpowiednie zdarzenie. n największy deskryptor ze wszystkich trzech zbiorów plus 1. timeout maksymalny czas oczekiwania na powrót z funkcji. 0 powrót natychmiastowy, NULL potencjalnie nieskończony czas oczekiwania. Zwraca: liczbę znalezionych deskryptorów lub -1 w przypadku błędu. 19

Sprawdzanie stanu gniazd W pliku sys/types.h zdefiniowano cztery makra przeznaczone do operowania na zbiorach deskryptorów: FD_ZERO(fd_set *set) usuwa wszystkie deskryptory ze zbioru *set, FD_SET(int fd, fd_set *set) dodaje deskryptor fd do zbioru *set, FD_CRL(int fd, fd_set *set) usuwa deskryptor fd ze zbioru *set, FD_ISSET(int fd, fd_set *set) sprawdza, czy deskryptor fd znajduje się w zbiorze *set. Zwykle używane po wykonaniu funkcji select(). 20

Przykład: C svr_pseudocon_echo_tcp(){ int s0, s, maxs, alen; struct sockaddr_in sin; fd_set afds, //zbiór aktywnych deskryptorów rdfs; //zbiór znalezionych deskryptorów w funkcji select() if((s0=passivesock(testport, "tcp", 10))<0){ fprintf(stderr, "passivesock: %s\n", strerror(errno)); return -1; maxs = s0; FD_ZERO(&afds); FD_SET(s0, &afds); 21

Przykład: C while(1){ bcopy((char *)&afds, (char *)&rdfs, sizeof(afds)); if (select(maxs+1, &rdfs, NULL, NULL, 0)<0){ fprintf(stderr, "select: %s\n", strerror(errno)); return -1; if (FD_ISSET(s0, &rdfs)){ //nowe połączenie alen = sizeof(sin); if((s=accept(s0, (struct sockaddr *)&sin, &alen))<0){ fprintf(stderr, "accept: %s\n", strerror(errno)); return -1; FD_SET(s, &afds); if (s>maxs) maxs = s; // if 22

Przykład: C for (s=0; s<=maxs; s++){ // nawiązane połączenia if(s!=s0 && FD_ISSET(s, &rdfs)){ echod(s); if (close(s)<0){ fprintf(stderr, "close: %s\n", strerror(errno)); return -1; FD_CLR(s, &afds); //for //while 23

Przykład: Java import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.net.serversocket; import java.net.socket; import java.net.sockettimeoutexception; import java.util.enumeration; import java.util.vector; public class EchoPseudoConcurentTCPServer { private static final int LINELEN = 100; public static void main(string args[]){ Socket s; OutputStream os; InputStream is; int i; if (args.length<1){ System.out.println("wywolanie java EchoPseudoConcurentTCPServer port"); return; 24

Przykład: Java byte[] buffer = new byte[linelen]; Vector v = new Vector(); Enumeration e; try { ServerSocket ss = new ServerSocket( Integer.parseInt(args[0])); ss.setsotimeout(1); v.clear(); while(true){ try{ s = ss.accept(); catch (SocketTimeoutException ex){ s = null; if (s!=null){ s.setsotimeout(1); v.add(s); 25

Przykład: Java for(e=v.elements(); e.hasmoreelements(); ){ s = (Socket)e.nextElement(); is = s.getinputstream(); os = s.getoutputstream(); try{ i = is.read(buffer); catch(sockettimeoutexception ex){ continue; if (i>0){ os.write(buffer, 0, i); System.out.println("wyslano :" + new String(buffer, 0, i)); catch (IOException ex) { ex.printstacktrace(); 26

Jednoprocesowe serwery współbieżne Serwery jednoprocesowy wykonuje wszystkie zadania zarówno procesu głównego jak i procesów podporządkowanych serwera wieloprocesowego. Po zgłoszeniu gotowości przez gniazdo główne, serwer nawiązuje nowe połączenie. Gdy jest gotowe do obsługi którekolwiek z pozostałych gniazd, serwer czyta zapytanie nadesłane przez klienta i odsyła odpowiedź. 27

Porównanie serwerów Serwer iteracyjny czy współbieżny. iteracyjny - prostszy do zaprogramowania i konserwacji, współbieżny krótszy czas oczekiwania na odpowiedź. Współbieżność rzeczywista czy pozorna. rzeczywista połączenia obsługiwane niezależnie, pozorna niezależne połączenia korzystają lub wymieniają wspólne dane. Serwer bezpołączeniowy czy połączeniowy. bezpołączeniowy sieć lokalna, małe prawdopodobieństwo błędów transmisji, połączeniowy wszystkie pozostałe zastosowania. 28

Podsumowanie W ramach wykładu zostały zaprezentowane przykładowe implementacje podstawowych, omawianych wcześniej typów serwerów, z wykorzystaniem mechanizmów dostępnych w systemach UNIX. Współbieżność w serwerach może być realizowana poprzez wielowątkowość / wieloprocesowość lub też poprzez utrzymywanie i obsługę wielu połączeń w pojedynczym wątku. 29