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

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

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

•

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

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

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

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

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

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

  • 1. Wstęp
  • 2. Cel projektu
  • 3. Technologia
  • 4. Projekt modułu
    • 4.1 Algorytm działania
    • 4.2 Dostępne polecenia
      • 4.2.1 Wyświetlenie informacji o wszystkich poleceniach
      • 4.2.2 Wyrzucenie gracza z serwera
      • 4.2.3 Zablokowanie adresu IP gracza
      • 4.2.4 Wyświetlenie listy zbanowanych adresów IP
      • 4.2.5 Usunięcie zablokowania adresu IP gracza
      • 4.2.6 Wyświetlenie aktualnej lub zmiana na nową startowej liczby pieniędzy
      • 4.2.7 Zmiana trybu gry
      • 4.2.8 Zresetowanie serwera gry
      • 4.2.9 Wyświetlenie aktualnej lub zmiana na nową maksymalną liczbę klientów
      • 4.2.10 Wyświetlenie aktualnej lub zmiana na nową wartość czasu na ruch
  • 5. Realizacja modułu
  • 6. Propozycje rozbudowy projektu
  • 7. Literatura