Gniazdo Unix - model serwera klienta
Większość aplikacji sieciowych wykorzystuje architekturę klient-serwer, która odnosi się do dwóch procesów lub dwóch aplikacji, które komunikują się ze sobą w celu wymiany informacji. Jeden z dwóch procesów działa jako proces klienta, a inny proces działa jako serwer.
Proces klienta
Jest to proces, który zazwyczaj polega na żądaniu informacji. Po otrzymaniu odpowiedzi proces ten może się zakończyć lub wykonać inne przetwarzanie.
Example, Przeglądarka internetowa działa jako aplikacja kliencka, która wysyła żądanie do serwera sieci Web w celu uzyskania jednej strony internetowej w formacie HTML.
Proces serwera
To jest proces, który przyjmuje żądanie od klientów. Po otrzymaniu żądania od klienta proces ten wykona wymagane przetwarzanie, zgromadzi żądane informacje i wyśle je do klienta żądającego. Po zakończeniu staje się gotowy do obsługi innego klienta. Procesy serwera są zawsze czujne i gotowe do obsługi przychodzących żądań.
Example - Serwer sieci Web czeka na żądania z przeglądarek internetowych i gdy tylko otrzyma żądanie z przeglądarki, odbiera żądaną stronę HTML i wysyła ją z powrotem do tej przeglądarki.
Należy pamiętać, że klient musi znać adres serwera, ale serwer nie musi znać adresu ani nawet istnienia klienta przed nawiązaniem połączenia. Po ustanowieniu połączenia obie strony mogą wysyłać i odbierać informacje.
Architektury dwu- i trójwarstwowe
Istnieją dwa typy architektur klient-serwer -
2-tier architecture- W tej architekturze klient współpracuje bezpośrednio z serwerem. Ten typ architektury może mieć pewne luki w zabezpieczeniach i problemy z wydajnością. Internet Explorer i serwer sieci Web działają w architekturze dwuwarstwowej. Tutaj problemy z bezpieczeństwem są rozwiązywane za pomocą protokołu Secure Socket Layer (SSL).
3-tier architectures- W tej architekturze jeszcze jedno oprogramowanie znajduje się pomiędzy klientem a serwerem. To oprogramowanie pośrednie nazywa się „oprogramowaniem pośrednim”. Oprogramowanie pośredniczące służy do wykonywania wszystkich kontroli bezpieczeństwa i równoważenia obciążenia w przypadku dużego obciążenia. Oprogramowanie pośredniczące pobiera wszystkie żądania od klienta i po wykonaniu wymaganego uwierzytelnienia przekazuje je do serwera. Następnie serwer wykonuje wymagane przetwarzanie i wysyła odpowiedź z powrotem do oprogramowania pośredniego, a na końcu oprogramowanie pośredniczące przekazuje tę odpowiedź z powrotem do klienta. Jeśli chcesz zaimplementować architekturę trójwarstwową, możesz zachować wszelkie oprogramowanie pośrednie, takie jak oprogramowanie Web Logic lub WebSphere, pomiędzy serwerem WWW a przeglądarką WWW.
Rodzaje serwerów
Istnieją dwa typy serwerów, które możesz mieć -
Iterative Server- To najprostsza forma serwera, gdzie proces serwera obsługuje jednego klienta i po wykonaniu pierwszego żądania przyjmuje żądanie od innego klienta. Tymczasem kolejny klient czeka.
Concurrent Servers- Ten typ serwera uruchamia wiele współbieżnych procesów, aby obsłużyć wiele żądań jednocześnie, ponieważ jeden proces może trwać dłużej, a inny klient nie może czekać tak długo. Najprostszym sposobem napisania współbieżnego serwera pod Uniksem jest rozwidlenie procesu potomnego do obsługi każdego klienta osobno.
Jak zrobić klienta
System wywołań ustanowienia połączenia jest nieco inny dla klienta i serwera, ale oba obejmują podstawową konstrukcję gniazda. Oba procesy tworzą własne gniazda.
Kroki związane z ustanowieniem gniazda po stronie klienta są następujące -
Utwórz gniazdo z socket() wywołanie systemowe.
Podłącz gniazdo do adresu serwera za pomocą rozszerzenia connect() wywołanie systemowe.
Wysyłaj i odbieraj dane. Można to zrobić na wiele sposobów, ale najprostszym sposobem jest użycie rozszerzeniaread() i write() wywołania systemowe.
Jak stworzyć serwer
Kroki związane z ustanowieniem gniazda po stronie serwera są następujące -
Utwórz gniazdo z socket() wywołanie systemowe.
Powiąż gniazdo z adresem przy użyciu rozszerzenia bind()wywołanie systemowe. W przypadku gniazda serwera w Internecie adres składa się z numeru portu na komputerze hosta.
Nasłuchuj połączeń z listen() wywołanie systemowe.
Zaakceptuj połączenie z accept()wywołanie systemowe. To wywołanie zazwyczaj blokuje połączenie, dopóki klient nie połączy się z serwerem.
Wysyłaj i odbieraj dane za pomocą read() i write() wywołania systemowe.
Interakcja klienta i serwera
Poniżej znajduje się diagram przedstawiający pełną interakcję klienta i serwera -