Kao prvo, hehe, da se pohvalim, popravio sam slova šđčćž
Eto nema više upitnika -.-
Kako?
Nažalost, izgleda da niste pročitali moj tekst. Uopšte nije važno ko je klijent i kakav je njegov protokol. Evo primjera. Očigledno je da vam se ne čitaju longpostovi
Dakle, kako “natjerati” WinBoard i mIRC programe da omoguće korisnicima da igraju šah međusobno …
Evo u stilu gastronomije :
Sastav: (u zagradama su imena klasa)
Jedna Model klasa šaha (plugins.chess.ChessPlugin)
Jednu klasu za sporazumijevanje sa IRCom (clients.irc.IRCClient)
Jednu klasu za razumijevanje WinBoarda (clients.winboard.WinBoardClient)
Jedan Kontroler za upravljanje šahom koji će biti u sklopu (usko vezan) za WinBoardClient ali će ustvari upravljati ChessPluginom. (clients.winboard.ChessAdapter - neka vas ne zabuni to što ga zovem adapterom ovdje …)
Jedan Kontroler za upravljanje šahom u sklopu IRCClient’a (clients.irc.ChessAdapter)
Jedan adapter koji callbacke servera prevodi u format razumljiv IRC-u (clients.irc.ChessClientAdapter)
Jedan adapter isto to ali za winboard (clients.winboard.ChessClientAdapter)
I još brdo dodataka za IRCClient (po potrebi) dok WinBoard ostaje na tom jednom, jer ipak interfejs i protokol winboardov ne omogućavaju, šta ti znam, Go’a npr …
E kako to sad radi …
Glavni server sluša na portu 3000 npr.
Klijent (ne znamo ko je) se povezuje na taj port.
Server je već pokrenuo (singleton!) instance svih plugina.
Klijent šalje neke podatke kao identifikaciju.
Ti podaci se uspoređuju sa nekim šablonima i na osnovu tih prvih poslanih bajtova ili redova karaktera se utvrđuje “ko je to sa one strane žice”.
Tom klijentu (klasi koja upravlja konekcijom) se pridružuje odgovarajuća Client klasa. U ovom slučaju naš server može da primi samo WB i IRC klijente. IRC će se poznati po tome što mu prva linija uvijek počinje sa USER linijom … WinBoard se prepoznaje slično tako … znači nema problema sa tim.
Nakon identifikacije, sav budući “transfer”, tj podaci koje klijentske aplikacije pošalju na server biće prevedene od strane Client’a (IRCClient ili WinBoardClient) i od tih različitih “komandi” (npr u IRCu će se upravljati tako što, npr ako igrate sa “GedomGluperdom”, jednostavno pošaljete privatnu poruku - PRIVMSG) Client treba da pozove odgovarajuću funkciju unutar plugin Modela. Jasno?
O plugin modelu. Ili igri. Kako to izgleda u slučaju šaha? Evo šta treba klasa da ima:
Atributi:
ime bjelog igraca
ime crnog igraca
odigrani potezi
status
Funkcije:
bijeli_igra(potez)
crni_igra(potez)
chat(poruka) # opcionalno za klijente, opcionalno za server
bijeli_predaje()
crni_predaje()
…
E dakle, ti Client’i treba da recimo “PRIVMSG GedoGluperda: e4” prevedu u poziv funkcije plugins.ChessModel.bijeli_igra((1,4), (3,4)) i tako dalje …
I na kraju …
Dosadašnji tekst je objasnio kako različite klijent aplikacije govore serveru, a evo sada kako server govori njima !
Kada bjeli igrač pozove bjeli_potez(…) ostali igrači moraju biti obaviješteni o tome (u ovom slučaju - crni igrač. inače mogu tu biti i gledaoci). To se radi tako što se sada koristi ono što sam pominjao kao Adapteri, naime sad Model šaha poziva funkciju “bjeli_je_igrao(šta)” za svakog prisutnog igrača i nema veze kakve su njihove aplikacije jer svaki od njih ima svoju verziju od “bjeli_je_igrao” funkcije … U ovom slučaju, naš server će pozvati clients.irc.ChessClientAdapter.bjeli_je_igrao i clients.winboard.ChessClientAdapter.bijeli_je_igrao … itd … etc …
kontate sad?
dvosjmjerno prevođenje protokola sa modelom u sredini koji reguliše pravila, evidentira rezultate i ostalo …
uskoro ću da okačim i dijagram…
ovo bi trebao biti ogroman i veoma kvalitetan proizvod. ozbiljno