![]() |
![]() ![]() Usługa klient-serwer : gra "wisielec"Ogólnie o usłudzeGra wisielec polega na odgadnięciu słowa. Użytkownikowi pokazywane są dwie lub jedna ze skrajnych liter wyrazy, w zależności od jego długości, i mając 9 prób odgaduje się kolejne litery wyrazu. Każda pomyłka pociąga za sobą dorysowanie kolejnego elementu szubienicy.Przyjęte zasady gryJak już wspomniałem gracz może popełnić 9 razy błąd, za dziewiątym razem gra jest przerywana i szubienica wraz z wisielcem jest w 100% kompletna.Ogólny szkielet usługiUsługa działa w oparciu o program klienta i serwera, które porozumiewają się za pośrednictwem protokołu TCP/IP ver.4. Oba moduły napisane są w języku PHP. Serwer nasłuchuje na porcie 1111 czy nie przychodzą żadne zapytania do niego. Jeżeli takowe się pojawi jest ono obsługiwane w stosowny sposób. Serwer może obsługiwać dwa rodzaje klientów :GRACZ - który łączy się z serwerem w celu uzyskania danych niezbędnych do gry. Klient łączy się z pośrednictwem klienckiego skryptu php, który wyświetla GUI dla gracza, uruchamiane z przeglądarki internetowej. ADMINISTRATOR - może się on połączyć z serwerem za pośrednictwem telnet'u i uzyskać statystyki serwera, wyłączyć go, itd. Komunikacja administrator-serwerSerwer nasłuchuje na porcie 1111. W momencie gdy przyjdzie połączenie na ten port zostaje ono obsługiwane w stosowny sposób, jak na poniższym schemacie.![]() Powyższy schemat nie uwzględnia już 3-fazowej procesu zestawiania połączenia pomiędzy dwoma interfejsami w sieci, gdyż ta metoda jest już zaimplementowana w funkcjach z socket_listen i socket_create z których korzystamy. Skupimy się na protokole warstwy siódmej modelu ISO/OSI, który został zaimplementowany na potrzeby powyższej gry. Za każdym razem gdy zostanie zestawione połączenie serwer wysyła HelloMsg. Wiadomość ta zawiera menu komend jakie można wydawać serwerowi w celu jego administracji (widoczne na obrazku powyżej). Pokrótce postaram się je teraz opisać. LIST - komenda ta nakazuje serwerowi odesłanie do klienta listy wszystkich słów kluczowych, jakie mogą być użyte podczas gry. STATS - dzięki tej komendzie serwer łączy się z bazą danych MySQL i pobiera z niej odpowiednim zapytanie dane które posłużą do zestawienia statystyki. Statystyka pokazuje, czasy po jakich użytkownicy odgadli hasło lub nie, jak również ilu graczy zakończyło grę (pozytywnie lub nie), jaka jest średnia punktów zdobytych oraz kiedy został uruchomiony serwer. LOGS - Komenda ta włącza lub wyłącza system zapisywania dziennika zdarzeń do pliku. Defult'owo przy starcie serwera jest to włączone. Logi zapisywana są do pliku logFile.txt w katalogu w którym znajduje się serwer, tak więc katalog ten musi mieć ustawione prawa na 0777. LOGOUT - Jest zwykłe wylogowanie administratora z serwera i pozostawienie go w stanie normalnej pracy. SHUTDOWN - komenda ta zakańcza działanie serwera. ![]() Komunikacja gracz-serwerW tym przypadku sytuacja wygląda podobnie jak w komunikacji z administratorem za pośrednictwem telnetu.Jak już wspomniałem przy każdym nowym połączeniu wysyłane jest przez serwer HelloMessage, w przypadku gracza, wiadomość ta jest odbierana ale jest ignorowana gdyż jest ona dla niego zbędna. Na początku gracz wysyła do serwera komunikat giveMeWord po otrzymaniu której serwer z listy dostępnych słów kluczowych losuje jedno i odsyła je do gracza. Gracz może również obejrzeć pierwszą piętnastkę najlepszych graczy. Aby uzyskać ten ranking wysyłany jest do serwera pakiet o treści giveMeRanking na który serwer reaguje odpowiednim zapytaniem do bazy danych MySQL i następnie odsyła w odpowiedniej formie dane do gracza. W momencie gdy gracz zgadnie słowo lub popełni dziewięć błędów wysyłany jest do serwera pakiet takeResults, a zaraz zanim idzie kolejny pakiet z następującymi danymi - ksywa gracza (podawany na początku gry), czasie jaki upłynął od rozpoczęcia gry, ilości popełnionych błędów oraz hasło jakie miał odgadnąć lub odgadną gracz. Następnie serwer zapisuje to w bazie danych. Po każdej z tych cząstkowych operacji (giveMeWord, giveMeRanking, takeResults) strona klienta zakańcza połączenie i chcąc uzyskać jakiekolwiek dane łączy się ponownie. W przypadku połączenia administratora jest to połączenie ciągłe do momentu wydania przez administratora komendy logout lub shutdown. "Współbieżność" serweraSerwer działa w oparciu o funkcję socket_select() jest to odpowiednik funkcji select() z języka C.Całość wygląda następująco. Na początku tworzone jest gniazdo nasłuchujące i deskryptor tego gniazda podawany jest jako parametr funkcji socket_select(). W tym momencie funkcja zwraca sterowania systemowi, który może zając się innymi zadaniami. W momencie gdy pojawi się jakiekolwiek zdarzenie na tym gnieździe sterowanie oddawane jest z powrotem do programu, jednocześnie jest tworzony nowy deskryptor (zwracany przez funkcje socket_select) za pośrednictwem którego możemy obsłużyć dane połączenie. Jeżeli połączenie zostało obsłużone i zakończone przez klienta deskryptor jest niszczony w innym przypadku dodawany jest do listy deskryptorów, które są pod kontrolą socket_select() i jeżeli cokolwiek się na nich wydarzy są obsługiwane odpowiednio. Środowisko programowaniaCała usługa została napisana w języku skryptowym PHP. Jeżeli chodzi o stronę klienta to wszystko jest w porządku i zastosowanie tego typu języka jest jak najbardziej trafione. Niestety pisania serwera gry w PHP który sam pracuję pod kontrolą innego serwera (np.: Apache) jest mało udanym pomysłem. Można by to napisać w C lub Perlu i wydaje mi się że byłaby to bardziej wydajna aplikacja. Powodem takiej konstrukcji serwera jest dobra znajomość języka PHP i to że czuję się w nim lepiej niż w C.Jak to uruchomićPodstawowo do uruchomienia potrzebny będzie nam serwer www z obsługą PHP i MySQL'a. Podczas kompilacji należy dodać opcję --enable-sockets, która umożliwi korzystanie nam z całej rodziny funkcji sockets (http://pl.php.net/manual/en/ref.sockets.php). Dodatkowo serwer musi obsługiwać sesje, za pośrednictwem których przekazywane są dane podczas gry po stronie klienta. Teraz zostaje nam jeszcze tylko ustawienie MySQL'a. W pliku includes/db.php podajemy dane niezbędne do połączenia się z bazą danych, a w samej bazie danych wykonujemy plik hangmen.sql, który utworzy nam odpowiednią tabele i wypełni ją kilkoma rekordami.Jeszcze na koniec należy ustawić prawa katalogu w którym znajduje się plik serwer.php na 0777, gdyż inaczej nie będzie można tam utworzyć pliku z logami. Skoro to wszystko już poustawialiśmy odpalamy serwer przez odpalanie odpowiedniej ścieżki w przeglądarce, a następnie to samo robimy z klientem. W przypadku klienta na starcie musimy podać adres ip serwera oraz port na jakim pracuje, w naszym przypadku jest to port 1111 (można to zmienić ręcznie w pliku serwer.php). Dodatkowo w kliencie należy na starcie podać swoją ksywkę, po której będziemy rozpoznawani i umieszczani w rankingu. Możemy jeszcze dostać się na serwer po przez telnet łącząc się z określonym adresem ip na port 1111. DodatkowoPrzygotowałem również wersje tej gry nie wymagającą serwera, działa w oparciu o samodzielnego klienta, który komunikuje się z bazą danych. Zobacz sam.Myślę że to wszystko, życzę miłej zabawy, wszelkie uwagi i pytania proszę kierować pod info@bogodesign.net ![]() |