Sieciowe zabawy

Niegdyś do utworzenia choćby prostego klienta Telnetu czy innej sieciowej usługi potrzebna była szczegółowa wiedza na temat gniazd (sockets) i protokołów. Programowanie sieciowe wymagało przygotowania teoretycznego i uwagi – była to odrębna dziedzina wiedzy, do poznania której garnęło się niewielu koderów.

Z czasem jednak Internet zyskiwał na znaczeniu, a narzędzia programistyczne stawały się coraz wygodniejsze i bardziej rozbudowane. RAD-y Borlanda w zasadzie od początku swego istnienia pomagają programistom – za sprawą odpowiednich komponentów – okiełznać Sieć. Trzeba jednak przyznać, że większość użytkowników np. Delphi odetchnęła z ulgą dopiero wtedy, gdy we wspomnianym środowisku pojawił się doskonały zestaw kontrolek autorstwa firmy Indy (www.indyproject.org). Pozwalają one na szybką implementację w zasadzie dowolnego klienta/serwera sieciowego (patrz: ramka „Komponenty Indy”).

My wykorzystamy opisane narzędzia do napisania prostej gry – znanej wszystkim zabawy w kółko i krzyżyk. Przykładowy program będzie jednak można łatwo przebudować w typowy czat sieciowy czy nawet pokusić się o implementację nieskomplikowanego komunikatora typu Gadu-Gadu.

Przygotowanie do pracy

Wszystkie narzędzia potrzebne do zakodowania sieciowego programu można znaleźć w Internecie lub na płycie CD/DVD dołączonej do niniejszego numeru. Na DVD zamieściliśmy m.in. 30-dniową wersję Delphi 7 Enterprise (zawierającą pełen zestaw kontrolek Indy). Jeśli chcemy skorzystać z darmowej wersji środowiska, najlepiej będzie zdobyć np. Delphi 6 Personal i pobrać ze strony Indy zestaw komponentów (wersja Indy dla Delphi 7 PE nie jest jeszcze dostępna).

Jeśli chodzi o dokumentację komponentów, to jest ona dostępna z poziomu Pomocy Delphi. Bardziej dociekliwi Czytelnicy mogą poszperać w sekcjach Articles i F.A.Q. witryny producenta kontrolek. Jeszcze uwaga dla początkujących użytkowników Delphi: standardowa konfiguracja skrótów klawiaturowych w RAD-ach Borlanda zwyczajowo uniemożliwia wpisywanie polskich znaków. Nie inaczej jest w Delphi 7 – nie ma jednak powodu do rozpaczy. Wystarczy pobrać z witryny www.borland.pl (sekcja

Do pobrania | Delphi | Poprawki i uzupełnienia

) plik REG z odpowiednią poprawką – po jego użyciu problemy z polską klawiaturą znikną.

Komponenty Indy
Indy (skrót od Internet Direct) jest zbiorem doskonałych, opensource’owych komponentów sieciowych, przeznaczonych dla RAD-ów firmy Borland. Kontrolki zostały napisane w Delphi i obsługują większość popularnych protokołów sieciowych. Można je pobrać za darmo z Sieci, zawiera je również Delphi w wersjach 6 i 7 (z wyjątkiem darmowych edycji tego środowiska).
      Indy wykorzystują wariant obsługi gniazd z blokowaniem (blocking sockets). Oznacza to, że dopóki określona operacja (np. odbieranie danych) nie zostanie zakończona, gniazdo jest blokowane dla aplikacji. Z tego powodu praca z komponentami Indy przypomina obsługę plików – zasób jest blokowany, a w przypadku błędu generowany jest wyjątek.

Odrobina teorii jest potrzebna

Zanim przystąpimy do tworzenia pierwszej sieciowej aplikacji, powinniśmy poznać choćby podstawy działania tego typu programów. Pomoże nam to w przyszłości w tworzeniu optymalnie działających narzędzi – zamiast machinalnego używania tej czy innej kontrolki.

Komponenty Indy wykorzystują do swego działania protokoły z grupy TCP/IP, będące podstawą działania globalnej Sieci (przy okazji: oznacza to, że w celu testowania naszych przykładowych programów będziemy musieli zainstalować w systemie operacyjnym obsługę tego właśnie protokołu). Dzięki temu programy powstałe z użyciem kontrolek Indy działają zarówno w większości sieci lokalnych (LAN), jak i w Internecie.

Jak wiadomo, cały świat aplikacji internetowych działa, opierając się na modelu klient-serwer. Oznacza to ni mniej, ni więcej, że każde połączenie sieciowe jest tworzone przez klienta wysyłającego żądania do stale oczekującego na nie serwera. Dzieje się tak w przypadku par przeglądarka/serwer WWW, klient/serwer poczty elektronicznej, FTP, SSH itd. Nie inaczej będzie z naszą grą – choć obie strony zabawy są w zasadzie równoprawne, to jedna będzie musiała pełnić funkcję serwera przez cały czas trwania połączenia.

Standardem komunikacji pomiędzy klientem i serwerem jest użycie tzw. gniazd (sockets) sieciowych. Mechanizm ten opisany jest w ramce „Gniazda sieciowe” – dla uproszczenia można przyjąć, że mamy tu do czynienia z dwiema parami komunikujących się obiektów typu serwer:port na obu „końcach” połączenia. Oczywiście zagadnienie jest o wiele bardziej skomplikowane, jednak czarną robotę wykonają za nas komponenty Indy.

Zwróćmy jedynie uwagę na sposób, w jaki serwer obsługuje żądania od wielu klientów. Miałoby to miejsce na przykład wtedy, gdybyśmy wydzielili osobny serwer dla naszej gry i łączyli się z nim za pomocą dwóch klientów. Przebieg sesji przedstawia diagram na rysunku „Przebieg połączenia TCP/IP”. Okazuje się, że znakomita większość serwerów sieciowych jest wielowątkowa – tzn. potrafi kontaktować się jednocześnie z wieloma klientami. Dzieje się tak dzięki mechanizmowi wątków (threads). Serwer – w momencie nawiązania kontaktu z klientem – uruchamia osobny wątek, obsługujący konkretne połączenia, a sam może oczekiwać dalszych żądań.