här - Programmer and CEO

 Nätverksprogrammering, EDA095
Projektrapport för kortspelslobby
Anton Botvalde,[email protected]
Mats Lundkvist, [email protected]
Jonathan Schön, [email protected]
Handledare:
Björn Johnsson Bakgrund
Under kursen nätverksprogrammering på LTH så var ett av delmomenten att göra ett projekt inom nätverksprogrammering som gav en djupare förståelse i hur de olika teknikerna inom nätverksprogrammering kan användas. Detta projekt riktade in sig på klient­server kommunikation. Projektet är en spellobby där olika bord för kortspel med tillhörande chatt finns. Programmet använder sig av TCP för att kommunicera mellan klienten och servern. Klienten kopplar upp sig till en server för att kunna spela och skicka meddelande till andra spelare. Kravspecifikation
Från början av projektet föreslog vi följande krav, rankade efter hur viktiga vi tyckte de var. De understrukna kraven är implementerade. Viktiga ● När man ansluter till servern ska man hamna i en lobby. ● I lobbyn ska det finnas olika bord man kan sätta sig vid för att spela. ● Varje bord ska visa... ○ hur många som är vid bordet. ○ vilket spel som spelas. ○ status för spelet (väntar/pågående) ● Varje bord ska ha ett eget chattrum. ● Spelet som ska kunna spelas är Programmer & CEO. (Slav & President) ● Spelet ska stödja 4 spelare. ● Man ska kunna se hur många kort varje spelare har kvar. ● Man ska kunna se tur ordningen och vems tur det är att spela. ● Spelet ska avbrytas när någon lämnar bordet. ● Det ska ej gå att fuska. Bra att ha ● Man kan skicka privata medellanden som bara en mottagare kan se. ● Vinnaren ska få byta kort med förloraren. ● Fler än fyra spelare per bord. ● Färre än fyra spelare per bord. Om tid finns ● Man ska kunna justera spelreglerna. (Fler jokrar, 2 kortlekar etc.) ● Det ska gå att spela andra spel. Modell
Hela systemet består av sex olika paket: client, game, gui, messages, misc och server som är utspridda på 46 java filer och ca 3600 rader kod. Vilka typer av klasser som förekommer i de olika paketen framgår tydligt av paketnamnen. Flest antal klasser förekommer i messages, då vi har många kommandon mellan server och klienterna. Varje message är något slags kommando med relevant information. Vi använder TCP för att kommunicera mellan klienten och servern för att säkerställa att alla meddelanden kommer fram. Då det förekommer många klasser och mycket kod har vi valt att ge en övergripande bild över hur systemet funkar, för mer detaljerad information hänvisar vi till källkoden som finns tillgänglig på projekts hemsida. När servern startas, Server, så skapar Server en GameServer och en LobbyServer. Dessa är separata trådar och körs så länge servern är igång. Servers funktion är att acceptera nya anslutningar. När en klient ansluter sig till servern, (vilket sker i uppstarten av klientens program i klassen Client) får denna ange ett användarnamn. När Server väl tagit emot detta skapas en User som knyter ihop användaren med bland annat namn och en socket. Servern skapar även en InputThread för varje ny användare. Denna tråd hanterar all input från en specifik klient och är igång så länge klienten är ansluten mot servern. När en klient väl skickar en förfrågan av något slag tar InputThread hand om det och bestämmer vart meddelandet ska skickas vidare till; antingen LobbyServer eller GameServer. InputThread skickar vidare meddelandet genom att lägga in det in respektive servers mailbox. LobbyServer och GameServer ligger sedan och hämtar meddelande från sina mailboxar och avgör vad som ska göras. Om vi tar exemplet att klienten skickat en förfrågan om att vilja ansluta till ett kortspel så undersöker GameServer om klienten får göra det eller inte. GameServern skickar tillbaka någon form av feedback, t.ex. GameJoinMessage vilket tillåter klienten att ansluta till det förfrågade bordet. Precis som serven är klienten uppbyggd med flera olika klasser som har ansvar för ett specifikt område (Client, GameClient, LobbyClient) och kommunikation mellan dessa sker via mailboxar. Client hämtar meddelande som skickats från servern och bestämmer vart dessa ska hamna, antingen i GameClient eller LobbyClient som i sin tur bearbetar meddelandet. Användarhandledning
Server Starta först servern genom att köra Server.jar filen i förslagsvis en terminal/kommandotolk. Om java är installerat korrekt så kan servern startas med: java ­jar Server.jar [<port>] Om ingen port anges kommer port 1234 att användas. Klient Klienten startas precis som servern enklast i en terminal/kommandotolk. java ­jar Client.jar [<värd> <port>] Om ingen port anges kommer port 1234 att användas. Om ingen värd anges kommer localhost att användas. Om bara port anges kommer den att försöka ansluta till mlundkvist.se på den porten. Om inga argument anges alls så kommer klienten försöka ansluta mot localhost på port 1234. Lobbyn När man ansluter till en server får man först mata in ett användarnamn. Därefter möts man av följande GUI. Lobbyn visar en användarlista där man kan se alla användare som är anslutna för tillfället. En chattruta där alla meddelanden från användare samt meddelanden från servern när användare ansluter och lämnar servern visas. En panel med alla borden som finns på servern, vilket spel som spelas vid varje bord, hur många spelare där är vid bordet samt spelets status. Vill man skicka ett privat meddelande till en användare kan man använda följande kommando: @@<anv namn> <meddelande> Då skickas ett meddelande från dig till bara den användaren du angav. Mottagaren kan se vem meddelandet kom ifrån och svara på samma sätt. Spelbord När man går till ett bord möts man av följande GUI. Precis som i lobbyn består den högra delen av en lista med användare och en chattruta. I chattrutan visas även vem som lade vilka kort och vem som är nästa spelare etc. Även här går det bra att skicka privata meddelanden precis som i lobbyn. För att starta ett spel vid ett bord måste alla spelare vid borde trycka på Ready knappen. Spelet (Programmer & CEO) Målet är att bli av med alla sina kort först, då blir man ‘CEO’. Blir man den siste personen med kort kvar blir man ‘programmer’. En vanligt kortlek med 52 kort används tillsammans med 4 jokrar, ess är högst. Alla korten fördelas jämnt till alla spelare. Turordning och den som får spela först är slumpad. Spelets regler är följande: Den som spelar först får lägga ett eller flera valfria kort som uppfyller följande: ● Om flera kort spelas måste de vara av samma valör. ● Kortet eller korten får inte enbart bestå av jokrar. Efter att den första spelaren spelat, gäller följande: ● Kort som spelas måste vara av en högre valör än vad som var spelat senast. ● Kort som spelas måste vara lika eller fler till antalet. (Om två 5:or är spelade måste man lägga mist två 6:or, 7:or, 8:or, osv.) ● Kan man eller vill man inte spela några kort kan man passa. ● Om alla spelare passar, får den som lade senast börja om med valfritt/valfria kort med samma regler som för den som spelade allra först ● Jokrar måste alltid kombineras med minst ett vanligt kort. Utvärdering
Projektet startade lite trögt och drabbades även av ett avhopp från en projektmedlem. Trots det tycker vi att projektet i sin helhet blev lyckat. Alla de viktiga kraven blev uppfyllda samt flera extrafunktioner blev implementerade. Tyvärr hann vi inte med det sista momentet till kortspelet där vinnaren får ta två kort av förloraren samt ge bort två till förloraren. Visserligen så är detta moment en vanlig del av spelet när man spelar med riktigt kort, men online där man kanske spelar med främlingar finns det inget som hindrar förloraren att helt enkelt lämna spelet för att slippa hamna i den dåliga sits som spelet sätter förloraren i. Det är dock inte helt omöjligt att om vi varit fyra personer som jobbat aktivt hela tiden så skulle denna funktion blivit klar. Det var svårt i början att veta vad som var bra nätverksdesign och vad som var mindre bra då ingen av oss jobbat med nätverksarkitektur förrut. Vi implementerade först en klient och server som kommunicerade genom att skicka olika strängar. Strängarna innehöll kommandon, ett antal parametrar och eventuellt ett meddelande. Det blev snabbt jobbigt att behöva analysera informationen som skickats både på klienten och servern och att lägga till nya kommandon var klumpigt. Vi kom ganska långt med implementationen men valde senare att skrota den i favör mot att skicka hela objekt istället för strängar. Vi förlorade två­tre arbetsdagar på att skriva om koden till att skicka objekt istället. Om vi hade fått göra om projektet igen så hade vi fokuserat på att i början inte lägga ner för mycket tid på den valfria funktionaliteten. Vi fokuserade lite väl mycket enbart på kosmetiska funktioner till lobbyn i början, vilket kan ha medfört att projektet fick en långsammare start än väntat. Överlag så har projektet varit både roligt och givande. Vi känner att vi har lärt oss mycket om klient­server arkitektur samt nätverksprogrammering i Java. Programlistor
Projektets hemsida har följande adress: www.surnet.se. På hemsidan finns jar­filer, källkoden samt denna rapport.