background image

Analizator poleceń

służących do obsługi

serwera do gry w 

ruletkę

Projekt z przedmiotu Gramatyki,

Automaty i Techniki Translacji

Mateusz Macięga

informatyka

gr. 42

background image

Spis treści

1.Wstęp...........................................................................................................3
2.Cel projektu...................................................................................................3

3.Technologia...................................................................................................3
4.Projekt modułu..............................................................................................3

4.1Algorytm działania.....................................................................................3
4.2Dostępne polecenia...................................................................................4

4.2.1Wyświetlenie informacji o wszystkich poleceniach....................................4
4.2.2Wyrzucenie gracza z serwera................................................................4

4.2.3Zablokowanie adresu IP gracza.............................................................5
4.2.4Wyświetlenie listy zbanowanych adresów IP............................................5

4.2.5Usunięcie zablokowania adresu IP gracza...............................................6
4.2.6Wyświetlenie aktualnej lub zmiana na nową startowej liczby pieniędzy.......6

4.2.7Zmiana trybu gry................................................................................6
4.2.8Zresetowanie serwera gry....................................................................7

4.2.9Wyświetlenie aktualnej lub zmiana na nową maksymalną liczbę klientów....7
4.2.10Wyświetlenie aktualnej lub zmiana na nową wartość czasu na ruch..........8

5.Realizacja modułu..........................................................................................8
6.Propozycje rozbudowy projektu........................................................................9

7.Literatura......................................................................................................9

background image

1. Wstęp

Praca inżynierska „Aplikacja umożliwiająca wieloosobową grę w ruletkę” wiąże

się   ze   stworzeniem   projektu   aplikacji   opartej   na   architekturze   klient-serwer,

stworzeniu serwera gry, który będzie zarządzał rozgrywką, klienta gry, który będzie się
łączył z serwerem i protokołu komunikującego serwer z klientami i na odwrót. Serwer

gry jest serwerem nasłuchującym co oznacza, że serwer działa w tym samym procesie
co   klient   gry.   Gracz,   który   będzie   zarazem   serwerem   musi   mieć   możliwość

konfigurowania ustawień serwera wpływających na rozgrywkę.
 

2. Cel projektu

Celem projektu jest stworzenie modułu w mojej aplikacji z grą pozwalającego

na interpretacje poleceń wydawanych przez gracza będącego serwerem oraz translacje
na konkretne działania aplikacji. Możliwość wydawania poleceń serwerowych będzie

miał jedynie gracz prowadzący rozgrywkę. Możliwe polecenia zostaną zdefiniowane w
aplikacji.

3. Technologia

Cała aplikacja ruletki zaimplementowana została w języku Java. Z tego powodu

moduł również został napisany w języku Java. Do stworzenia interfejsu graficznego

wykorzystane   zostały   biblioteki   graficzne   AWT   i   Swing,   natomiast   do   komunikacji
sieciowej   wykorzystałem   bibliotekę   NIO   udostępniającą   nieblokujące   operacje

wejścia/wyjścia   i   selektory,   które   umożliwiają   obsługę   wielu   gniazd   sieciowych   za
pomocą jednego wątku.

4.

Projekt modułu

Moduł składa się z paru klas odpowiedzialnych za interpretacje wprowadzonego 

polecenia, translacje na konkretne działanie aplikacji i ewentualnie przekazanie 

pakietów do klientów.

4.1

Algorytm działania

Interpretacja wprowadzonego tekstu przez gracza. Są dwie możliwości: gracz
wprowadza   wiadomość,   która   ma   trafić   do   innych   graczy   lub   wprowadza

polecenie, które ma zostać obsłużone przez serwer. Nas interesuje jedynie ta
druga opcja. Każde polecenie poprzedzone jest znakiem „/”. Na tej podstawie

decydujemy czy wprowadzony tekst jest poleceniem.

Polecenie  trafia  do klasy  obsługującej polecenia (klasa  „ObslugaPolecen”).  W
metodzie tej klasy każde polecenie jest parsowane. Jeśli otrzymane polecenie

nie   jest   jednym   ze   zdefiniowanych   poleceń   zostaje   odrzucone,   zostanie
wyświetlony odpowiedni komunikat.

3/9

background image

Polecenie jest analizowane pod kątem jego typu. Dla każdego typu zdefiniowana

jest   metoda,   która   wykonuje   odpowiednie   działanie   w   zależności   od
otrzymanych argumentów.

Jeśli istnieje taka potrzeba to przesyłane są pakiety do klientów i wykonywane

są odpowiednie działania.

4.2 Dostępne polecenia

Wszystkie   polecenia   zdefiniowane   są   w   typie   wyliczeniowym   (enum)   dzięki

czemu   jesteśmy   w   stanie   w   łatwy   sposób   dodać   kolejne   polecenia   do   obsłużenia.
Każde polecenie zawiera prawidłowy format wywołania oraz opis polecenia. Obecnie

zdefiniowanych jest 10 poleceń. 

4.2.1 Wyświetlenie informacji o wszystkich poleceniach

Polecenie   odpowiedzialne   jest   za   wyświetlenie   wszystkich   zdefiniowanych

poleceń wraz z poprawną konstrukcją oraz opisem polecenia. Poprawna konstrukcja

oraz opis polecenia zapisany jest w typie wyliczeniowym.

Budowa polecenia:

/info

Wypisanie   wszystkich   poleceń   oraz   informacji   o   tych   poleceniach   odbywa   się   za

pomocą pętli for:

for(ObslugaPolecen.TypyPolecen p : ObslugaPolecen.TypyPolecen.values())

{

wiadomosc += "- " + p + ", format: " + p.dajBudowePolecenia() + "\n  opis: " + 

p.dajOpisPolecenia() + "\n";

}

4.2.2 Wyrzucenie gracza z serwera

Polecenie odpowiedzialne za wyrzucenie gracza z serwera. Polecenie przyjmuje

dwa  argumenty  z  czego   drugi  jest   opcjonalny.  Pierwszym   argumentem  jest   nazwa
gracza   obecnego   na   serwerze,   a   drugim   jest   powód,   dla   którego   gracz   zostanie

usunięty. Po otrzymaniu takiego polecenia serwer sprawdza czy połączony jest klient o
podanej nazwie gracza. Jeśli taki gracz istnieje to gracz zostaje usunięty z listy graczy

połączonych   oraz   do   pozostałych   klientów   zostaje   wysłany   pakiet   informujący   o
wyrzuceniu gracza z serwera.

Budowa polecenia:

/kick nazwaGracza [powódWyrzucenia]

Z tym poleceniem związany jest pakiet o nazwie „Pakiet05KickPlayer”. Budowa tego
pakietu jest następująca:

05nazwaGracza,RpowódWyrzuceniaK

Pierwsze   dwa   bajty   określają   typ   pakietu.   Następne   bajty   aż   do   znaku   „,”

4/9

background image

przeznaczone są na nazwę gracza, którego chcemy wyrzucić z serwera. Następnie jest

litera „R” (reason, powód), po literce „R” podany jest powód wyrzucenia gracza. Każdy
pakiet zakończony jest literą „K”. 
Klient po otrzymaniu takiego pakietu usuwa z listy graczy gracza z podaną nazwa oraz

wyświetla komunikat wraz z powodem wyrzucenia.

4.2.3 Zablokowanie adresu IP gracza

Polecenie   odpowiedzialne   za   zablokowanie   dostępu   dla   adresu   IP   gracza.

Przyjmuje   dwa   argumenty:   pierwszy   oznacza   nazwę   gracza,   a   drugi   powód

zbanowania gracza. Drugi argument jest opcjonalny. Serwer po otrzymaniu takiego
polecenia   sprawdza   czy   klient   o   podanej   nazwie   jest   z   nim   połączony.   Jeśli   jest

połączony to wyciągany jest adres IP tego gracza z listy klientów. Adres IP gracza
zostaje   dodany   do   listy   zablokowanych   adresów   IP   serwera   wraz   z   nazwą   gracza.

Każdy   klient,   który   chce   się   połączyć   z   serwerem   jest   sprawdzany   pod   kątem
obecności jego adresu IP na liście adresów zablokowanych. Żeby klient był w stanie

dołączyć   do   gry   jego   adres   IP   nie   może   znajdować   się   na   liście   adresów
zablokowanych.

Budowa polecenia:

/ban nazwaGracza [powódZablokowania]

Z   poleceniem   tym   związane   są   dwa   pakiety.   Pierwszy   z   nich   to   pakiet
Pakiet06BanPlayer”,   który   odpowiedzialny   jest   za   poinformowanie   klientów   o

zablokowaniu gracza. Pakiet trafi również do klienta, który zostanie zablokowany. Po
odebraniu takiego pakietu pojawi mu się okienko z informacją a następnie zostanie

rozłączony z serwerem.
Budowa pakietu „Pakiet06BanPlayer”:

06nazwaGracza,RpowódZablokowaniaK

Drugim   pakietem,   który   jest   powiązany   z   tym   poleceniem   jest   pakiet

Pakiet07LoginDenied”.   Jest   to   pakiet,   który   zostaje   wysłany   graczowi,   który
próbuje dołączyć do gry, informujący o zaniechaniu próby dołączenia. Mogą być trzy

powody otrzymania takiego pakietu: adres IP klienta jest zablokowany, nazwa gracza
jest już w użyciu lub serwer jest prywatny i należy podać hasło dostępu.

4.2.4 Wyświetlenie listy zbanowanych adresów IP

Polecenie wyświetlające listę zbanowanych adresów IP. Lista składa się z dwóch 

kolumn. W pierwszej znajduje się zbanowany adres IP, a w drugiej nazwa gracza, 
który korzystał z tego adresu IP. 

Budowa polecenia:

/banlist

Podobnie jak w przypadku polecenia „/info” wyświetlanie odbywa się za pomocą pętli
for: 

5/9

background image

String wiadomosc;
if(((List) gra.gniazdoSerwera.zbanowaniGracze).size() == 0) {

wiadomosc = "Brak zbanowanych adresów IP";

        }

        else {
            wiadomosc = "Zbanowane adresy IP:\n";

            for(GraczMP g : gra.gniazdoSerwera.zbanowaniGracze){
                wiadomosc += "- " + g.dajAdres().getHostName() + " (nazwa gracza: " + 

g.dajPseudonim() + ")\n";
            }

            wiadomosc = wiadomosc.substring(0, wiadomosc.lastIndexOf("\n"));
        }

4.2.5 Usunięcie zablokowania adresu IP gracza

Polecenie   umożliwiające   usunięcie   żądanego  adresu   IP   z  listy  zablokowanych

adresów.   Możemy   to   wykonać   na   dwa   sposoby.   Pierwszy   sposób   polega   na
przekazaniu adresu IP, który chcemy usunąć, natomiast drugi na przekazaniu nazwy

gracza, który posługiwał się adresem IP w momencie zablokowania.

Budowa polecenia:

/unban adresIP|nazwaGracza

Jeśli dany adres IP lub nazwa gracza znajdują się na liście zablokowanych adresów to

adres zostanie usunięty z tej listy i gracze korzystający z tego adresu znów będą mogli
uczestniczyć w rozgrywce.

4.2.6 Wyświetlenie aktualnej lub zmiana na nową startowej liczby

pieniędzy

Polecenie pozwalające na wyświetlenie aktualnej startowej liczby pieniędzy lub

zmianę   na   nową   wartość.   Każdy   gracz   dołączają   do   gry   rozpoczyna   rozgrywkę   z
początkową liczbą pieniędzy zdefiniowaną przez serwer. Informacja ta przekazywana

jest w jednym z pakietów konfiguracyjnych. Polecenie  przyjmuje  opcjonalnie jeden
argument z nową wartością startową. Jeśli nie podamy tego argumentu to zostanie

wyświetlona aktualna wartość.

Budowa polecenia:

/startmoney [nowaWartośćStartowa]

Dokonana   zmiana   wartości   zostaje   wprowadzona   dopiero   po   dokonaniu   restartu

serwera za pomocą polecenia „/restart”.

4.2.7 Zmiana trybu gry

Polecenie   pozwala   nam   wyświetlić   aktualny   oraz   zmienić   tryb   rozgrywki.

Dostępne są dwa tryby: public – publiczny lub private – prywatny, dostęp do serwera

jedynie po wpisaniu hasła dostępu. Polecenie przyjmuje opcjonalnie jeden argument
oznaczający   nowy   tryb.   Jeśli   nie   podamy   argumentu   to   zostanie   wyświetlony

komunikat o aktualnym trybie. Jeśli wybranym trybem będzie tryb prywatny to wtedy
wyświetlone   zostanie   okno   dialogowe   gdzie   należy   podać   nowe   hasło   dostępu   do

6/9

background image

serwera. Tryb zostaje zmieniony po wprowadzeniu polecenia.
Budowa polecenia:

/changemode [public|private]

4.2.8 Zresetowanie serwera gry

Polecenie   umożliwiające   zresetowanie   serwera   gry.   Zresetowanie   serwera

oznacza   rozpoczęcie   od   nowa   rozgrywki   z   początkową   wartością   pieniężną   oraz

określonym czasem na ruch. Jeśli dokonaliśmy wcześniej zmiany początkowej wartości
pieniężnej lub czasu na ruch to zmiany te są wprowadzane. Polecenie nie przyjmuje

żadnych argumentów.
Budowa polecenia:

/restart

Z   poleceniem   „restart”   związany   jest   pakiet   „Pakiet08Restart”,   który   zostaje

przesłany   do   wszystkich   klientów.   Pakiet   zawiera   ustawienia   serwera.   Klient   po
otrzymaniu takiego pakietu wie, że serwer został zresetowany.

Budowa pakietu „Pakiet08Restart”:

08MkwotaStartowaK

Pierwsze dwa bajty (08) oznaczają typ polecenia. Po literze „M” zapisana jest wartość 
początkowa pieniędzy. Litera „K” jest znakiem końca pakietu.

4.2.9 Wyświetlenie aktualnej lub zmiana na nową maksymalną 

liczbę klientów

Serwer ma możliwość określenia maksymalnej liczby klientów. Jeśli liczba 

klientów będzie równa liczbie maksymalnej liczby klientów to żaden nowy klient nie 
będzie w stanie dostać się do gry. Polecenie umożliwiające wyświetlenie aktualnej 

maksymalnej liczby klientów lub zmiana na nową wartość. Polecenie przyjmuje 
opcjonalnie jeden argument oznaczający nową maksymalną liczbę klientów. Jeśli nie 

podamy argumentu wyświetlona zostanie aktualna wartość.
Budowa polecenia:

/maxclients [maksLiczbaKlientow]

Dokonana   zmiana   wartości   zostaje   wprowadzona   dopiero   po   dokonaniu   restartu

serwera za pomocą polecenia „/restart”.

7/9

background image

4.2.10

Wyświetlenie aktualnej lub zmiana na nową wartość 

czasu na ruch

Serwer gry  ma możliwość  określenia  czasu  na ruch  w  rundzie.  Runda  może

zostać zakończona na dwa sposoby. Pierwszy sposób polega na zakończeniu stawiania
zakładów   przez   wszystkich   graczy,   natomiast   drugi   polega   na   minięciu   czasu

przeznaczonego na zakłady. Polecenie umożliwia wyświetlenie aktualnej lub zmianę na
nową wartość czasu na ruch. Polecenie przyjmuje opcjonalnie jeden argument będący

nową wartością czasu na ruch. Jeśli argument nie zostanie podany serwer wyświetli
aktualną wartość.
Budowa polecenia:

/bettime [czasNaRuch]

5. Realizacja modułu

Okno aplikacji Ruletka:

Moduł wykorzystuje dolną część okna. W dolnej części okna znajduje się czat, za 
pomocą którego możemy komunikować się z innymi graczami oraz wpisywać polecenia

serwerowe.
Moduł uruchamiany jest w momencie wpisania wiadomości, ze znakiem początkowym 
„/”.

8/9

background image

6. Propozycje rozbudowy projektu

Projekt może zostać rozbudowany poprzez dodanie  kolejnych  poleceń. Każde

polecenie   powinno   posiadać   odpowiadającą   procedurę,   która   wykonuje   działania
serwerowe. Dodatkowo możemy rozbudować o dodatkowe funkcjonalności istniejące

już polecenia.

7. Literatura

Ron Hitchens, „Java NIO”, First Edition, O’Reilly, 2002

javax.swing (Java Platform SE 7 ) - Oracle Documentation 
http://docs.oracle.com/javase/7/docs/api/java/nio/package-summary.html

java.awt (Java Platform SE 7 ) - Oracle Documentation 

http://docs.oracle.com/javase/7/docs/api/java/awt/package-summary.html

9/9


Document Outline