Saját listener, vagy más

Saját listener, vagy más
2009-08-18T16:34:22+02:00
2009-08-31T23:56:41+02:00
2022-07-19T16:20:59+02:00
barii86
Sziasztok!

van egy listem, vagy linkedList, mindegy!

azt szeretném megoldani, hogy egy listener figyeljen, és ha bekerül vagy kikerül a listábol egy elem, akkor a listener ezt vegye észre
hogyan lehet ezt megcsinálni?
--------
igaziból ez azért kell, mert socketeken kommonikálok egy játékban. A szituáció:

a szerverben meghivom, hogy jatekos1.lépj(), ez térjev vissza, hogy hova lépett. na most a szerver a socketen keresztül küld egy parancsot a kliensnek, hogy lépjen, a kliens lép, és vissza küldi, hogy hova lépett (na most hogy bonyolitva legyen, ez idő alatt mást is küldhet, pl chat részen) és a szerver akkor leellenőrzi, hogy mit küldött vissz a kliens. Én ezt úgy akarom megvalositani, hogy ami visszajött azt bele teszem egy listába, és figyelem egy listenerrel. De ha tudtok más módszert, az is király lenne.

uh, de most hogy így jobban meggondolom, a listener nem is tér vissza semmivel. szóval inkább azt mondanám, hogy elvesztem ez ügyben Tudnátok segíteni?

köszi
Mutasd a teljes hozzászólást!
Te most nagyon belegabalyodtal a tervezesi mintakba. Az altalam javasolt felepitesben ket helyen erdemes Observert alkalmazni:

1. Socket figyelesere, letrehozhatsz pl egy ObservedSocket osztalyt, az observer interfesznek meg lenne ket metodusa: dataReceived meg socketError...

2. A UI-modell kapcsolatahoz, ha szepen el akarod kuloniteni oket (UI az obszerver).

Tegy egy lepest hatra, probald megerteni a tervezesi mintak celjat, elonyeiket, hatranyaikat, ne ragadj le az oket abrazolo diagrammokon. Egyik minta sem kobevesett szabaly, sem svejci bicska, bemutatnak neked egy praktikus megoldast egy bizonyos tervezesi problemara, adhatnak otleteket. De az altaluk bemutatott elveket alkalmazd es igazitsd a te problemadra, ne forditva!
Mutasd a teljes hozzászólást!

  • Ellenorizd a socketbol valo olvasasbol, hog mi erkezett...
    Mutasd a teljes hozzászólást!
  • de honnan tudjam, hogy mikor kell olvasni onnan?
    Mutasd a teljes hozzászólást!
  • Egy kulon szalon egy vegtelen ciklusbol olvasol be a socketbol. A beolvasas blokkolni fog, hacsak nem allitottad nonclockingra a socketet. Ha meg olvastal be adatot a ciklusban, meghivsz egy metodust, ami lekezeli azt, itt hasznalhatod az Observer tervezesi mintat.
    Mutasd a teljes hozzászólást!
  • na de
    ott van a hálózati rész, egy while(true), benne figyeli, hogy mi jött, és mondjuk bejön ez egy változóba. de hogyan forom azt a változót vissza adni a jatekos1.lepj()-ben?
    Mutasd a teljes hozzászólást!
  • az observer azt csinálja, hogy beállítja a observable tulajdonságát, és szól a megfigyelőknek, hogy változás volt. de én azt akarom hogy mondjuk figyelem, hogy mi történt egy változóban, és ha az került bele, ami nekem kell, akkor vissz atudok térne... nem?
    Mutasd a teljes hozzászólást!
  • de én azt akarom hogy mondjuk figyelem, hogy mi történt egy változóban, és ha az került bele, ami nekem kell, akkor vissz atudok térne... nem?


    Ezt fejtsd ki legyszi bovebben!

    A beolvasott erteket atadod az observernek, az majd eldonti, hogy mit csinal vele.
    Mutasd a teljes hozzászólást!
  • hmm... de én csak annyit akarok, hogy mikor meghivom a jatekos1.lepj()-t, akkor ez igy mukodjon:
    int mezo = jatekos1.lepj()

    na most ha observer van, akkor az értesíti a megfigyelőket, hogy történt valami, azaz a megfigyelők metódusait hívogatja, nem? azaz nem a lépj() tér vissza egy integerrel, hanem az obserable hívogatja az observerek notify matódusait
    Mutasd a teljes hozzászólást!
  • "int mezo = jatekos1.lepj()"

    ha jól értem, ez valami aszinkron móka lesz, hiszen várni kell amíg a felhasználó reagál a lépj()-re...
    Mutasd a teljes hozzászólást!
  • ez egy hálózatos társasjáték. a szerver szól a kliensnek, hogy lépjen, aztán várja, hogy jöjjön válasz, hogy melyik mezőre lépett a kliens. (vagy szól, hogy telket vásárólhat, és várja, hogy megveszi-e, stb)
    -------
    az előbb elirtam, az Observernek update metódusa van, nem notify
    Mutasd a teljes hozzászólást!
  • En elvalasztanam a modellt (a jatek allapota, babuk helyzete, stb.), kontrollert (ez kapja es dolgozza fel a UI/user es halozatrol erkezo utasitasokat), prezentacios reteget es halozati reszt.

    Amikor lepsz, a UI-ban a megfelelo helyre klikkelsz, melynek hatasara meghivodik a kontrollerben egy metodus. Ez eloszor validalja az esemenyt (pl leellenorzi, hogy valoban rajtad volt a sor lepni - ezt amugy a view-ben is megteheted, egyszeruen nem hagyod a usert klikkelni, amig ra nem kerul a sor), majd a modellben levo adatok alapjan kiszamolja a jatek uj allapotat (az ertesiteni fogja a UI-t, amely update-eli magat) es elkuldi a lepest a tavoli kliensnek.

    Amikor a tavoli klienstol erkezik egy uj uzenet, a networking resz a UI-hoz hasonloan ugyanannak a kontrollernek fogja meghivni a metodusait, a flow hasonlo.

    A fentebb emlitett observer-es moka a halozati reszbe kerul, lesz 2 thread-ed, egiken olvasol a socketbol, a masikon irsz. Ha erkezett uzenet, meghivodik az observer osztaly metodusa, amely ertelmezi az uzenetet, es meghivja a modell megfelelo metodusat...
    Mutasd a teljes hozzászólást!
  • az előbb elirtam, az Observernek update metódusa van, nem notify


    Nevezheted, aminek akarod, az elv a fontos...
    Mutasd a teljes hozzászólást!
  • kb így van felépítva, ahogy Te is írtad. De így az van, hogy tulajdonképpen 2 metódus van. amikor a szerver elküldi a játékosnak, hogy léphet, és van az, amit a observable hív.
    végülis megoldás, kb így van most, jó, nem egészen a tervezési minta szerint,de 2 metódussal:
    a jatekos.lépj(), és van az, hogy a hálózati rész megnézi, hogy milyen parancs jött, és ha az, hogy lépni kell, akkor végre hajtja. Így mindenből van egy kisbetűs meg egy nagybetűs metódusom. De azért ez így elég kusza lett egy idő után. Ezért szeretném megoldani egy metódussal.

    habár lehet, hogy nem is megoldható, mert ha listenerrel figyelem, akkor is külön függvény a listener....
    Mutasd a teljes hozzászólást!
  • amikor a szerver elküldi a játékosnak, hogy léphet


    Ne a szerver mondja meg a jatekosnak, hogy lepjen!

    A UI a jatek allapotanak (soron levo jatekos) fuggvenyeben engedjen teged lepni. A soron levo jatekost a controllerben modositod, es ennek fuggvenyeben "fogadod vagy utasitod el" a UI vagy halozatrol erkezo utasitasokat!
    Mutasd a teljes hozzászólást!
  • a játék állapota azért elég nagy.. ezt még át kell gondolnom, hogy hogyan oldom meg
    Mutasd a teljes hozzászólást!
  • a játék állapota azért elég nagy..


    Nemigazan szamit, ugyis meg kell lennie mindket felnel, ha nem akarsz rassan reagalo UI-t...
    Mutasd a teljes hozzászólást!
  • az ok, csak ugye a mintákban mindenhol egy változó vagy egy tömb az, amit megfigyelnek
    Mutasd a teljes hozzászólást!
  • Mik figyelnek meg mit..?
    Mutasd a teljes hozzászólást!
  • a subject osztályban egy vátozó van, ami ha nemváltozik, akkor szól. na most itt jön be az, hogy én most pull vagy push módon használjam (gondolom ez az), azaz hogy nem egy változóm van, hanem sok, és akkor mondjuk szól, hogy valami megválzotott, és elküldi, hogy mi, ls akkor az observer lekérdezi, hogy mi, vegy elküldi, hogy mi és mennyi lett, vagy másképp...
    Mutasd a teljes hozzászólást!
  • Ez a valtozo a modellben van?
    Mutasd a teljes hozzászólást!
  • Milyen observerrol beszelsz te most?
    Mutasd a teljes hozzászólást!
  • az observer minta arra való, hogy a konkrétSubject változójának az állapotáról értesüljenek az observerek, nem?
    milyen observerról? hát... ami van... gondolom a kliensek lesznek azok, vagyis az a rész, ami a klienseknek küld
    Mutasd a teljes hozzászólást!
  • Te most nagyon belegabalyodtal a tervezesi mintakba. Az altalam javasolt felepitesben ket helyen erdemes Observert alkalmazni:

    1. Socket figyelesere, letrehozhatsz pl egy ObservedSocket osztalyt, az observer interfesznek meg lenne ket metodusa: dataReceived meg socketError...

    2. A UI-modell kapcsolatahoz, ha szepen el akarod kuloniteni oket (UI az obszerver).

    Tegy egy lepest hatra, probald megerteni a tervezesi mintak celjat, elonyeiket, hatranyaikat, ne ragadj le az oket abrazolo diagrammokon. Egyik minta sem kobevesett szabaly, sem svejci bicska, bemutatnak neked egy praktikus megoldast egy bizonyos tervezesi problemara, adhatnak otleteket. De az altaluk bemutatott elveket alkalmazd es igazitsd a te problemadra, ne forditva!
    Mutasd a teljes hozzászólást!
  • asszem leesett.. majd holnap nekiállok
    Mutasd a teljes hozzászólást!
  • most az merült fel bennem, hogy ott van az UI observere, na most az UI-n elég sok változás tud végbe menni. Ilyenkor gyakorlatilag újra rajzolhatnám a játéktáblát, ami jó sok elemből áll, a pontokat, és minden eseménynél mg kéne nézni, hogy érkezett-e a felhasználóhoz lehetőség hogy valamit csináljon. Ilyenkor mi a szitu? szépen újra rajzolni mindent, paraméter az update-nek, vagy több observer?
    Mutasd a teljes hozzászólást!
  • Az rad van bizva, hogy mennyire teszed reszletesse az observable metodusait...
    Mutasd a teljes hozzászólást!
  • szóval akkor pl a paraméter átadása az korrekt?
    Mutasd a teljes hozzászólást!
  • Aszinkron kommunikáció és non blocking socket célravezetőbb lenne.

    Egy cikluson belül kezeled a kapcsolódást/lekapcsolódást írást/olvasást.
    Egy listába teszed a kliens objektumokat, a protokollban szerepelteted a cél kliens azonosítóját és az üzenetfajtákat lekezeled.

    pl:

    while (true) { try { if (...) { // kapcsolódás // kliens objektum létrehozása, listához hozzáadás pl. Hashmap } else (...) { // üzenet érkezett (célkliens, üzenettípus, tartalom az üzenetbe kódolva) // üzenet feldolgozása // klienslistából célkliens objektum megszerzése // írás socketchannelre (üzenet továbbítás ha szükséges) } } catch (....) { // kivételkezelés } }
    Mutasd a teljes hozzászólást!
abcd