AKADEMIA GÓRNICZO-HUTNICZA Wydział Elektrotechniki, Automatyki, Elektroniki i Informatyki Computer Games Poker Bot - komunikacja Dokumentacja Wersja z dnia 01.01.2012 Zespół: Kamil Mazurek Tomasz Kruczkowski Prowadzący przedmiot: dr inż. Bartosz Ziółko
1. Cele projektu Celem projektu jest dostarczenie komunikacji do platformy służącej do grania w pokera za pośrednictwem internetu w szczególności ma posłużyć do testowania efektywności botów utworzonych w ramach projektu Poker Bot. Na etapie ustalania wymagań wyznaczone zostały następujące funkcjonalności: Tworzenie graczy Zapisywanie graczy wraz z ich statystykami w bazie danych Tworzenie stołów do gry Dołączanie do wybranego stołu Szkielety metod umożliwiających wykonywanie operacji operacji związanych z grą (np. fold) Szkielety metod umożliwiających monitorowanie stołu/stołów Metoda waitengine dodana na życzenie zespołu odpowiedzialnego za Engine Dodatkowym wymaganiem jest implementacja przykładowego klienta komunikującego się z serwerem. 2. Struktura Projekt składa z 3 mniejszych projektów: PokerTable PokerClient PokerTableCommons PokerTable jest projektem który realizuje część serwerową. Obsługuje zapytania od klienta oraz komunikuje się z bazą danych. PokerClient jest projektem który realizuje część kliencką. Kieruje zapytania do serwera i odbiera od niego odpowiedzi. PokerTableCommons w ramach naszego projektu (komunikacja) jest wykorzystywany jako zbiór klas wspólnych dla klienta i serwera. 3. Wykorzystane technologie Projekt w całości został zaimplementowany w języku Java z wykorzystaniem Spring Framework. Komunikacja odbywa się za pomocą CXF i bazuje na protokole SOAP. PokerTable może zostać zdeployowany np. na Tomcacie lub Glassfishu. Dodatkowo możliwe jest uruchomienie aplikacji na serwerze Jetty (np. dla testów, przez goal jetty:run). Każdy z trzech wymienionych w punkcie drugim mniejszych projektów jest projektem Mavena (Maven Project). Do persystencji wykorzystany został Hibernate oraz zaimplementowane zostały stosowne klasy DAO. Aplikacja może pracować z każdą bazą danych wspieraną przez Hibernate testy zostały przeprowadzone przy użyciu bazy danych MySQL.
4. Opis implementacji PokerTable realizuje (lub dostarcza rozwiązania, np. możliwość zapisu stanu gracza) wszystkie wymagania określone w punkcie pierwszym. Najważniejsze z nich to komunikacja z klientem, obsługa stołów do gry oraz persystencja. Metody serwera z których może korzystać klient określone są w interfejsie PokerTableInterface: @WebService public interface PokerTableInterface { public boolean createtable(string name); public String registerplayer(string name); public void jointable(string name, String token, String tablename); public List<TableBasic> getavailabletables(); public TableBasic gettablestatus(); public void fold(string name, String token, String tablename); public void raise(string name, String token, int amount, String tablename); public void allin(string name, String token, int amount, String tablename); public String helloworld() ; public CardsRoundWrapper ask(string name, String token, String tablename ) throws InterruptedException; } Implementacja tego interfejsu znajduje się w klasie PokerTableWebserviceBean: @WebService(endpointInterface = "pl.edu.agh.pokertable.common.pokertableinterface") public class PokerTableWebserviceBean implements PokerTableInterface { } Tworzenie wspomnianego beanu jest zdefiniowane w application-context.xml: <!-- PokerTableWebserviceBean --> <bean id="pokertablewebservicebean" class="pl.edu.agh.pokertable.webservice.pokertablewebservicebean"/> <jaxws:endpoint id="pokertablewebservice" implementor="#pokertablewebservicebean" address="/pokertable" /> Po zdeployowaniu PokerTable utworzony zostaje plik wsdl. Na lokalnym hoście ma adres: http://localhost:8080/pokertable/pokertable?wsdl
Wygenerowany wsdl jest wykorzystywany przez klienta w celu wygenerowania klas umożliwiających komunikację (przy pomocy wsdl2java zdefiniowanego w pom.xml). <execution> <goals> <goal>wsdl2java</goal> </goals> <configuration> <sourceroot>target/generated-sources</sourceroot> <wsdloptions> <wsdloption> <wsdl> wsdl/poker.wsdl </wsdl> </wsdloption> </wsdloptions> </configuration> </execution> Można je wygenerować np. za pomocą Maven generate-sources. Poniższy kod realizuje utworzenie gracza i dołączenie do stolika: PokerTableWebserviceBeanService ps = new PokerTableWebserviceBeanService(); PokerTableInterface proxy = ps.getpokertablewebservicebeanport(); proxy.createtable("stolik 1"); proxy.registerplayer("test"); proxy.jointable("test", "mojtoken", "Stolik 1"); Obsługa bazy danych realizowana jest przez DAO. Konfiguracja persystencji znajduje się w plikach.xml np.: jdbc.driverclassname=com.mysql.jdbc.driver jdbc.url=jdbc:mysql://localhost/poker jdbc.username=poker jdbc.password=poker2011 5. Przykładowa kompilacja i uruchomienie Na początku należy zbudować i umieścić w lokalnym repozytorium Mavena PokerTableCommons: cd pokertable/pokertablecommons mvn -U clean install... [INFO] BUILD SUCCESSFUL [INFO] Total time: 5 seconds [INFO] Finished at: Mon Jan 02 01:51:17 CET 2012 [INFO] Final Memory: 20M/230M
Podobnie można postąpić z PokerTable: cd pokertable/pokertable mvn -U clean install... [INFO] BUILD SUCCESSFUL [INFO] Total time: 24 seconds [INFO] Finished at: Mon Jan 02 01:53:51 CET 2012 [INFO] Final Memory: 46M/264M zostanie utworzony plik.war który można zdeployować np. używając Tomcata Drugi sposób uruchomienia PokerTable to wykorzystanie serwera Jetty: np. w Eclipsie można wykonać goal jetty:run 2012-01-02 01:58:51.748::INFO: jetty-6.1.10 INFO 02 sty 2012 01:58:57,181 ReflectionServiceFactoryBean - Creating Service {http://webservice.pokertable.agh.edu.pl/}pokertablewebservicebeanservice from class pl.edu.agh.pokertable.common.pokertableinterface INFO 02 sty 2012 01:58:58,759 ServerImpl - Setting the server's publish address to be /pokertable INFO 02 sty 2012 01:58:58,860 ContextLoader - Root WebApplicationContext: initialization completed in 6006 ms 2012-01-02 01:58:59.170::INFO: Started SelectChannelConnector@0.0.0.0:8080[INFO] Started Jetty Server Po zdeployowaniu (przykład dla localhost) pod adresem http://localhost:8080/pokertable/ (w zależności od skonfigurowanego portu) powinień być dostępny następujący widok: Tak długo jak serwer działa możliwe jest łączenie się z endpointem i wykonywanie udostępnionych funkcji. Można je wywoływać za pomocą klienta lub testować np. poprzez SoapUI.