Integrált információs rendszerek — Remoting labor
Ez az oldal a korábbi SCH wikiről lett áthozva.
Ha úgy érzed, hogy bármilyen formázási vagy tartalmi probléma van vele, akkor, kérlek, javíts rajta egy rövid szerkesztéssel!
Ha nem tudod, hogyan indulj el, olvasd el a migrálási útmutatót.
Erdélyi Tibor — tibi@aut.bme.hu
A laboron egy chat rendszert valósítottunk meg. A
futtatásához .NET 2.0 (Visual Studio 2005) szükséges. Ugyanezt a chat szervert és klienst megírtuk egyszer az Elosztott rendszerek laboron Visual Studio 2003 alatt.
Remoting alapok
A .NET alkalmazások külön AppDomain-ben futnak. Az AppDomain biztosítja a felügyelt futtatáshoz szükséges környezetet. Az AppDomainek közötti áthívás Remoting segítségével oldható meg. A csatornában szállított adat lehet bináris, XML vagy egyedi módon sorosítva. A csatorna típusa lehet TCP, HTTP vagy .NET 2.0-ban lokális gépen a jóval hatékonyabb IPC is.
A Remotingot támogató osztályok a MarshalByReference vagy MarshalByValue osztályból származnak le. A MarshalByReference azt jelenti, hogy a másik oldalon nem másolat keletkezik az objektumból, hanem csak egy Proxy objektum, ami eltakarja a távoli hívásokat.
A hívás módja lehet:
- _Single Call_: minden híváshoz létrejön egy példány, a kiszolgálás után megszűnik. Állapotmentes objektum, jól skálázható.
- _Singleton_: első hívás alkalmával létrejön az objektum, és ő szolgálja ki az összes kérést. A garbage collector nem tudja, hogy van-e rá távoli referencia, ezért a MarshalByRefObject InitializeLifetimeService metódusát kell felüldefiniálni az életciklus kezeléshez. Ha a metódus null-lal tér vissza, az objektum az alkalmazás lelövéséig élni fog.
Szerver konfigurálása
App.Config
- =mode="Singleton"=: egy szerver példány szolgálja ki a klienseket
- =type="ChatServer.Server, ChatServer"=: teljesen specifikált típus nevet vár. Saját típusnál névtér.típus, assembly név formátumú, beépített típusokra a következő módon kérhető le:
=Console.WriteLine(typeof(int).AssemblyQualifiedName);= - =channel ref="tcp"=, =port="9000"=: a szolgáltatás tcp protokollon, a 9000-es porton keresztül lesz elérhető
- =formatter ref="binary"=: az objektumokat binárisan sorosítsa
- =formatter typeFilterLevel="Full"=: mindent sorosítson (pl. event-eket is)
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.runtime.remoting> <application> <service> <wellknown mode="Singleton" type="ChatServer.Server, ChatServer" objectUri="ChatServer"/> </service> <channels> <channel ref="tcp" port="9000"> <serverProviders> <formatter ref="binary" typeFilterLevel="Full"/> </serverProviders> </channel> </channels> </application> </system.runtime.remoting> </configuration>
Fordításkor az App.Config átmásolódik a bin/debug könytvárba és átneveződik az alkalmazás nevére, ezért a Remoting inicializálásakor a következőképpen kell betölteni:
RemotingConfiguration.Configure("ChatServer.exe.config", false);
Kliens konfigurálása
App.Config
- =url="tcp://localhost:9000/ChatServer"=: a szerver címe
- =type="Common.ServerObj, Common"=: a szerverrel közösen használt objektum típusa
- =channel ref="tcp"=, =port="0"=: a kliens figyelje a szerver válaszát
<?xml version="1.0" encoding="utf-8" ?> <configuration> <system.runtime.remoting> <application> <client> <wellknown url="tcp://localhost:9000/ChatServer" type="Common.ServerObj, Common"/> </client> <channels> <channel ref="tcp" port="0"/> </channels> </application> </system.runtime.remoting> </configuration>
Indítás
A teszteléshez egy szervert és legalább két klienst érdemes indítani. A Solution / Set Startup Project menüpontban beállítható, hogy mindkettőből induljon egy-egy példány, de a második klienst csak parancssorból vagy a ChatClient / Debug / Start new instance menüponttal lehet elindítani.
-- Peti - 2006.11.09.