
A mellékelt példa fordítása után a szerveralkalmazást indítsuk el elsőként, majd a Client programokból tetszőleges számút úgy, hogy az egyes példányokat az SObject.dll assembly-vel együtt külön mappákban helyezzük el.
A megoldás lényege, hogy a Server.exe konzolalkalmazás induláskor regisztrálja a 1999-es számú http-csatornát, majd aktiválja a SINGLETON objektumot. Az objektum metódusainak meghívásával jutnak el az üzenetek a csevegő felekhez. A kliensek konferenciabeszélgetésre emlékeztető módon cseveghetnek, vagyis az egyikben elküldött üzenet valamennyi klienshez eljut.
A kliensek az 1001 és 1100 közötti csatorna-tartományban foglalhatnak le csatornát az üzenetküldéshez, vagyis amennyiben egy már foglalt csatornát kapnak, akkor a véletlen szám-generátor egy újabb számot képez számukra.
A következőkben megvizsgáljuk, hogyan történik az üzenetek elküldése. A projektek mindegyikében referenciaként meg kell adni a Remoting szolgáltatás eléréséhez szükséges System.Runtime.Remoting.dll állományt.
A SObject projekt fordítása után generálódott DLL referenciaként való megadása pedig a Server és a Client projektekben szükséges.
SObject projekt
A létrehozott SClass osztály példányosítása a szerver feladata. Ekkor az objektumot a szerver aktiválja (CAO objektum), SINGLETON objektumként regisztrálva azt.
Az objektum három metódussal rendelkezik, melyek a kliens-alkalmazás műveleteiben kerülnek meghívásra, miután a kliens elérte az objektumot.
Az objektum rendelkezik egy felhasználói listával, melyben tárolja a már csatlakozott kliensek nevét.
Az AddChatter metódusban megvizsgáljuk, hogy a kliens a megadott néven csatlakozott-e már. Ha igen, akkor hibaüzenetet adunk, egyébként a metódusban referencia-típusú paraméterként megadott szövegmező-kontrolban jelenítjük meg a csatlakozás tényét.
A felhasználó kijelentkezésekor a RemoveChatter metódust hívjuk meg, mellyel töröljük az adott felhasználót a listából.
A DoBroadCast metódusban küldjük el az üzenetet valamennyi csatlakozott kliensnek. A csatlakozott kliensek üzenetablakainak referenciáit egy listában tároljuk, és a metódus meghívásakor ezek mindegyikébe beírjuk az adott üzenetet. Így érhető el, hogy az üzenet minden ablakban megjelenjen.
Server projekt
A szerveralkalmazás egy konzol-program, melynek feladata csak az, hogy regisztrálja és aktiválja az objektum típusát.
Ekkor egy HttpChannel objektumot hozunk létre, melynek csatornaszáma 1999.
HttpChannel ch = new HttpChannel(channel);
ChannelServices.RegisterChannel(ch);
A csatornát regisztráljuk is. A következő lépésben a távoli objektum típusát nyerjük ki egy Type objektumba.
Type t = typeof(SObject.SClass);
Majd a típust regisztráljuk.
RemotingConfiguration.RegisterWellKnownServiceType(t, "SClass", WellKnownObjectMode.Singleton);
A kliensek által küldött üzenetek itt is megjelennek.
Client projekt
A kliensalkalmazásokban indulás után meg kell adnunk egy felhasználónevet, majd a BEJELENTKEZÉS gombbal aktiválnunk kell a távoli objektumot. Ekkor addig képzünk egy véletlen számot 1001 és 1100 közt, míg egy olyat találunk, amelynek a megfelelő csatornaszámot regisztrálni tudjuk hibaüzenet nélkül.
Random r = new Random();
int channel = 1000 + r.Next(1,100);
bool b = false;
while (!b)
{
...
ch = new HttpChannel(channel);
ChannelServices.RegisterChannel(ch);
...
A távoli, már aktivált objektumot a következőképpen példányosítjuk:
c = (SClass)Activator.GetObject(typeof(SClass),"http://localhost:1999/SClass");
Itt a csatorna számát, és a típust kell megadnunk a szerver címe után. Ezt követően a felhasználót az objektum AddChatter metódusával megpróbáljuk felvenni a felhasználói listába.
bool exist = c.AddChatter(textBox1.Text,channel,ref richTextBox1);
Amennyiben nem sikerül, a csatornát felszabadítjuk.
...
ChannelServices.UnregisterChannel(ch);
Amennyiben a felhasználó még nem szerepel a listában, akkor hozzáadjuk. A kijelentkezés a megfelelő feliratú gomb segítségével lehetséges.
Az ÜZENET KÜLDÉSE gomb segítségével elküldhetjük az alsó szövegmezőben megadott üzenetet a többi kliensnek.
c.DoBroadCast(user + ": " + textBox2.Text);
Az üzenet előtt a küldőt is feltüntetjük.