tom000 - Personal Website - Strona główna
decor1 Serwer HTTP decor2

Obsługa połączenia

    Po pomyślnym wczytaniu pliku konfiguracyjnego, tworzone jest gniazdo serwera (java.net.ServerSocket). Jako parametr obiekt ten przyjmuje numer portu, na którym ma zostać utworzone (pobierany z pliku konfiguracyjnego). Jeżeli utworzenie gniazda się nie powiedzie (np. wybrany port już jest zajęty), wyrzucany jest wyjątek, który od razu jest przechwycony, i na jego podstawie zwracany jest komunikat o błędzie, oraz następuje zamknięcie aplikacji.

    Po utworzeniu na wybranym porcie gniazda serwera, tworzona jest pewna pula wątków do obsługi połączenia z klientem. Liczba wątków, które mają być utworzone pobierana jest z pliku konfiguracyjnego. Jeżeli administrator serwera stwierdzi, że nie chce, aby przy starcie serwera była tworzona taka pula wątków, może ustawić ich ilość w pliku konfiguracyjnym na zero. Wątki są tworzone i uruchamiane, a w ich wnętrzu co 50 milisekund następuje sprawdzenie, czy nie została mu przypisana obsługa połączenia z klientem.

    Wątki serwera działają od siebie niezależnie, żaden z nich nie wie o istnieniu pozostałych, nie współdzielą też żadnych informacji. Dzięki temu prawie w ogóle nie wymagają żadnych mechanizmów synchronizacji (np. mutex, semafor). Pula wątków przechowywana jest w formie wektora (java.util.Vector). Kolekcja ta w przeciwieństwie do zwykłej listy (java.util.ArrayList) posiada metody synchronizowane, co ma znaczenie, ponieważ po ukończeniu obsługi połączenia pobrany z puli wątek sam dodaje siebie z powrotem do puli dostępnych wątków i gdyby np. równolegle dwa wątki chciały dodać siebie z powrotem do puli, jeden z nich mógłby zostać zastąpiony tym drugim.

    Dalej w aplikacji następuje wejście do nieskończonej pętli, wewnątrz której odbierane są połączenia z klientem (tworzony obiekt java.net.Socket). Po utworzenia połączenia, w pierwszej kolejności sprawdzana jest pula wątków, czy znajdują się w niej wolne wątki do obsługi tego połączenia. Jeżeli tak, następuje zdjęcie wątku z tej puli i przekazanie mu polecenia obsługi połączenia z klientem (wraz z utworzonym obiektem Socket). Jeżeli w puli nie ma wolnego wątku, to następuje jego utworzenie. Po zakończeniu obsługi połączenia przez taki utworzony wątek, nie jest on dodawany do puli dostępnych wątków, lecz usuwany.

← Plik konfiguracyjny Serwer HTTP Wiadomości HTTP →
Copyleft (C) tom000.info 2004-2012. Some rights reserved.