Legutóbb ott hagytuk abba, hogy kipakoltuk a
komponenseket a Formunkra. Most a protokollokról illetve más
érdekeségekről lesz szó.
Tisztázzunk még egy fontos alapfogalmat, melyre a múltkor
utaltam: a protokoll fogalmát.
A protokoll nem más, a hálózaton történő adatküldést meghatározó
szabályok és előírások gyűjteménye. Ezek a szabályok határozzák meg a
hálózati eszközök által küldött üzenetek tartalmát, formátumát,
időzítését, sorrendjét és hibakezelését.
Félig-meddig saját protokollt ígértem: ez azt jelenti, hogy az UDP-t
használjuk, de a küldött adatok formája, tartalma a saját szabályaink alapján
fog felépülni, mégpedig a következőképpen: alapvetően 3 részre
osztjuk az egész küldendő (kapott) üzenetet, egy felhasználói névre (pl.:
AnTi), egy parancsra (pl.: msg), és egy üzenetre (pl.: Hello!). Ehhez bizonyos
szeparátorokat (elválasztó jeleket) kell alkalmaznunk. Nálam ez a jel (de lehet
jelsorozat is) a #-karakter. Egy üzenetem így néz ki: #0AnTi#msg#Hello!. Mindig
#0 az üzenet eleje. Hogy miért? Mert így találtam ki.
Ezt természetesen csak egy saját kitaláció, ettől jobbat és szebbet is
alkothatunk, csak rajtatok múlik, viszont javaslom, hogy valami hasonlót
találjanak ki, mert ezzel mindent meg lehet csinálni. Nagy hangsúly van a „parancs”-on. Az utolsó részben erre még
kitérünk.
Összegezve: ki kell találnunk egy üzenetközlési formát, amilyen formára
hozzuk, illetve amilyen forma alapján szétbontjuk a küldendő/kapott
adatokat. A név küldése (AnTi) azért jó, mert sokkal barátságosabb, ha egy
nevet látunk, nem egy IP címet. Ha ez
megvan, akkor csak a saját parancsokat kell kitalálni, illetve ezekre a program
reakcióját és kipipálhatjuk a protokollt is.
Programunk nagy vonalakban:
Miután kitaláltuk a protokollt, elkezdhetünk gondolkodni,
mi is szükséges ahhoz, hogy működőképes programot kapjunk? Kell egy
üzenetküldő, illetve fogadó eljárás. Meg is vagyunk. Az üzenetküldőt
rendeljük hozzá az egyik gombunk OnClick
metódusához, a másikat pedig a Socket
OnDataReceived-jéhez.
Kezdjük mindjárt a közepével, írjuk meg az adatok
küldéséről szóló eljárást! Erre azért van szükség, mert több dolgot is
végre kell hajtanunk egy üzenet küldésekor. Az eljárás a következő
paramétereket kapja: Címzett IP címe,
a RemotePort, és az üzenet (mind
legyen string).
Az eljáráson belül az első dolgunk az legyen, hogy
beállítjuk a címzett paramétereit: IP
cím, és a RemotePort. Ezután, ha
szükséges alakítsuk át a paraméterként kapott üzenetet (ami az EditBoxba írtunk be) a magunk kitalált
protokoll formájára. Nagyon fontos, hogy az NMUDP
SendBuffer eljárását fogjuk használni. Ehhez szükségünk van egy 255 elemű
karakter tömbre (array[1..255] of char),
és egy ciklusváltozóra. Ezután egy egyszerű For ciklussal végigszaladunk a paraméterként kapott, protokollunkra
átalakított stringünkön, és megtöltjük vele a karaktertömböt. Ez lesz a SendBuffer eljárás első paramétere.
Második paraméterként a ciklusváltozót adjuk, mert oda az üzenet hossza kell.
Nincs más dolgunk, minthogy egy gomb OnClick
metódusához hozzárendelni, és gombnyomásra megy az EditBoxba írt üzenet! Ugye milyen egyszerű?
Az üzenetfogadás (OnDataReceived)
alapvetően nem sokban különbözik, csupán annyiban, hogy nem összerakni
kell az üzenetet „protokoll” formába,
hanem szétszedni (a szeparátorok segítségével az egyszerű gondoljunk pl. a
Pos-ra, de lehet ciklussal is), és a
parancs alapján cselekedni. A kapott adat feladójának IP címét a Socket FromIP
paramétere adja meg. Már tudjuk azt is, ki küldte az üzenetet, és azt is, hogy
mit cselekedjünk (kiírjuk, küldjünk vissza valamit, vagy hajtsunk végre egy
külső programot…stb.). Tulajdonképpen kész egy alapvető
üzenetküldő program (igazából inkább chat,
mert a kapott adatok azonnal láthatóak, és a válasz is azonnal adható).
Sorozatunk utolsó részében kibővítjük tudását oly
módon, hogy az már képes legyen detektálni saját IP címünket, a Windowsban
beállított nevünket, és azt, hogy más gépen fut-e a program – és ha igen, akkor
az adott gépet felvesszük egy listába (kilépésekor kivesszük), hogy később
tudjunk neki is küldeni, megismerkedünk a „Mindenki”
és a „Szonár” fogalmával, naplózunk,
és lesz még egy-két meglepetés…
A következő számban felkerül a korongra a teljes
példaprogram!
Remélem, velem tartotok a következő alkalommal is!
Üdvözlettel:
Hangya László Tamás (nickek: Gamf Antal,- Anti) anti.gamf@freemail.hu