A feladat két részből áll, mindegyik részhez elérhető egy parancssorból futtatható és egy Eclipse-es tesztelő.
parancssor
könyvtárba mint gyökérbe kell elkészíteni a megoldástteszt1.bat
és teszt2.bat
futtatásával indítható eleclipse
könyvtárba, a mellékelt projektek mellé el kell készíteni a 2017bead_osztott_domino
projektet2017bead2_osztott_domino
projekt előre el van készítve, ebben át kell állítani a hsqldb.jar
útvonalátFeltételek
DominoServer
főprogramját, majd három példányban a DominoClient
(illetve DominoClient2
) főprogramot. Ezután bevárja a főprogramok lefutását (ezeknek a tesztesetekben helyesen véget kell érniük), majd ellenőrzi, hogy helyes tartalom került-e a szerver kimeneti fájljába.
DominoTest
, illetve DominoRmiTest
osztályokban olvasható test1
, test2
stb. neveken.parancssor
vagy eclipse
könyvtárat kell zip
-pel összetömörítve.Parancssorból indítva a tesztelő elvárt kimenete:
===============================================
1. feladat
===============================================
JUnit version 4.12
.Nem megfelelo a jatekosok szama.
.....Nem megfelelo a jatekosok szama.
.
Time: 0,814
OK (7 tests)
===============================================
2. feladat
===============================================
JUnit version 4.12
..
Time: 0,817
OK (2 tests)
Készítsd el a dominó játék egy változatát. Socketekkel valósítsd meg, melyek szöveges üzenetekkel kommunikálnak egymással. Az osztályokat a domino
csomagba tedd.
DominoClient.java
)Az első parancssori paraméterként meg kell adni a felhasználó nevét, a későbbiekben ezt használjuk az azonosítására. A DominoClient
csatlakozzon a 60504
porton futó DominoServer
osztályhoz. A szerver kezdetben 7
dominót küld a kliensnek egy-egy sorban, aki ezekkel fog játszani. A dominókat szóközzel elválasztott két szám ábrázolja, az egyik és a másik oldalán lévő szám. A kliens elküldi a szervernek a nevét.
Ha ez a kliens kezd:
START
üzenetet kapja, akkor ez a kliens kezd.6
dominója maradjon.Ha egy másik kliens kezd:
VEGE
üzenetet kapja, akkor a kliens veszített.NYERTEM
üzenetet küldi el.UJ
üzenetet küldi.
NINCS
üzenetet küldi el a kliensnek és a következő játékos jön.VEGE
üzenetet kapja a NINCS
helyett.Példa:
kapott szám: 3
kiválasztott dominó: 2 3
elküldött szám: 2
A kliens minden alkalommal írja ki a képernyőre a kapott üzenetet és az általa elküldött üzenetet. Egy üzenet - válasz páros egy sorba kerüljön. A kiírás formája a következő legyen: <Játékosnév>: <kapott üzenet> <küldött üzenet>
. Abban az esetben, ha a kliens nem küld üzenetet (pl. új dominó kérésére kapott válasz), akkor a kiírásnál elhagyható a <küldött üzenet>
rész. A kliens hozzon létre egy fájlt a nevével megegyező néven txt
kiterjesztéssel (pl.: Jatekos1.txt
). Minden üzenetet, amit a képernyőre kiír, írja bele a fájlba is.
DominoServer.java
)A programnak parancssori paraméterként meg kell adni egy számot (n
) és egy fájlnevet.
A paraméterként adott szám (n
) határozza meg, hogy hányan játszanak egy játékot. A játékosok száma 2
és 4
között lehet, ellenőrizd a megkapott számot, hogy ebbe az intervallumba esik-e. Ha nem, írja ki a program, hogy Nem megfelelo a jatekosok szama.
és ekkor az alapértelmezett érték 2
játékos legyen.
A fájl tartalmazza a dominókat a következő alakban: egy sorban egy dominó két felén található szám van szóközzel elválasztva. A szervert sockettel valósítsd meg a 60504
porton. A szerver egyszerre egy játékmenet futtat le teljesen, majd véget ér.
Amikor mindegyik kliens csatlakozott, a szerver kezdje meg a játékot.
A játék menete:
7
dominót (mindenkinek másikat) abban a sorrendben, ahogy a fájlból beolvasta. Az első csatlakozó játékos az első 7
dominót kapja, a második a következő 7
-et és így tovább.START
üzenetet, ő kezd.UJ
, stb., ezeket nem kell elküldeni a következőnek, helyette a legutolsó olyan üzenetet kell elküldeni, ami egy dominón szereplő szám.NINCS
üzenetet küldi az adott játékosnak. Mindkét esetben a szerver ugyanazt a dominót küldi el a következő játékosnak, amelyet az előző játékos küldött (aki még tudott rakni dominót). Az a játékos, aki nem tudott rakni, nem esik ki, továbbra is játékban marad.VEGE
.VEGE
.A szerver minden lépésnél írja ki a parancssorban megkapott nevű fájlba, hogy milyen üzenetet kapott a kliensektől. Erre minta a _mo.txt
fájlokban látható.
DominoPlayer.java
):Készíts egy DominoPlayer
osztályt, ami a felhasználótól várja az utasításokat. A működése legyen hasonló a DominoClient
osztályhoz a következő módosításokkal:
UJ
szó megadásával kérhet.Készítsd el a domino.server.DominoStorageImpl
osztályt, amely a DominoStorageIface
interfésszel leírt szolgáltatást valósítja meg. Az osztály a UnicastRemoteObject
leszármazottja.
hsqldb
adatbázis-kapcsolatot erre a fájlra (a getConnection
paraméterezésénél: jdbc:file:kapott_szöveg
). A kapcsolat az objektum léte alatt végig maradjon fenn, és az egyszerűség kedvéért a lezárásával sem kell törődni. A konstruktor törölje az adatbázis Dominos
tábláját, ha létezik, és hozza létre egy user
és egy domino
szöveges oszloppal, valamint egy idx
egész számmal.save
metódusa a felhasználó nevét várja (userName
) és dominók egy listáját, amelyben a dominók szövegesen, a két oldalukat szóközzel elválasztva szerepelnek. Törölje az adatbázisból az összes olyan sort, amely a kapott felhasználóhoz tartozik, majd illessze be a dominókat egytől növekvő indexszel.load
metódusa szintén userName
paramétert kap, és egy listában adja vissza a felhasználó dominóit az adatbázisból. Előfordulhat, hogy a felhasználóhoz nincsen dominó rendelve, ekkor üres listát ad vissza.Készítsd el a domino.server.DominoDeploy
osztályt.
deploy
művelete paraméterként egy katalógust, egy RMI szolgáltatást azonosító nevet és az adatbázis fájlnevét kapja meg. Készítsen el egy DominoStorageImpl
példányt az utóbbi paraméter átadásával, majd jegyezze be a szolgáltatásba.1099
porton, majd hívja meg a deploy
metódust.Készítsd el a domino.DominoClient2
osztályt. Ez a fent leírt DominoClient
programhoz hasonló működésű, az alábbiakban tér el tőle.
saveAfterStep
), az RMI szolgáltatás nevét (dominoStorageName
) és egy felhasználónevet (userName
).UJ
üzenetre küldött választ ebbe bele nem értve).saveAfterStep
lépés megtörtént, ebbe beleértve a beküldött dominó eltávolítását, illetve az UJ
dominó beérkezését, akkor a kliens felveszi a kapcsolatot az RMI szerverrel, és feltölti rá a dominóit a felhasználónevén.