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
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.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
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
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