NobrElosztott rendszerek labor — Remoting/nobr

A VIK Wikiből
(ElosztottLaborRemoting szócikkből átirányítva)

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.


<style> code.pre { white-space:pre; display:block; } </style>

Lásd még: Integrált információs rendszerek — Remoting labor

Szimpla összeadás

Előkészületek

  • New Project / Other / Solution: RemotingLab
  • Add project / C# Class Library: Common
  • Add project / C# Console Application: Server
    • Add reference / Projects: Common
    • Add reference / .NET: System.Runtime.Remoting
  • Add project / C# Console Application: Client
    • Add reference / Projects: Common
    • Add reference / .NET: System.Runtime.Remoting
  • Solution / Properties / Startup Project: Multiple, 1. Server, 2. Client, mindkettő Start

Common / Class1.cs

namespace Common
{
	 public interface IBusinessLogic {
		  int Add(int a, int b);
	 }
}

Server / Program.cs

namespace Server
{
	 class BusinessLogic : MarshalByRefObject, IBusinessLogic
	 {
		  public int Add(int a, int b) {
				return a + b;
		  }
	 }

	 class Program
	 {
		  static void Main(string[] args) {
				TcpChannel channel = new TcpChannel(9000);
				ChannelServices.RegisterChannel(channel, false);
				// SingleCall: minden híváskor új objektum példány jön létre, ami a hívás végén megszűnik
				RemotingConfiguration.RegisterWellKnownServiceType(
					 typeof(BusinessLogic), "IBusinessLogic", WellKnownObjectMode.SingleCall);
				// A szerver csak addig tud aktiválni, amíg fut
				Console.ReadLine();
		  }
	 }
}

Client / Program.cs

static void Main(string[] args) {
	 IBusinessLogic ibl = (IBusinessLogic)Activator.
		  GetObject(typeof(IBusinessLogic), "tcp://localhost:9000/IBusinessLogic");
	 Console.WriteLine(ibl.Add(10, 3));
}

Chat

Common / Class1.cs

namespace Common
{
	 public interface IChatClient {
		  // OneWay: aszinkron hívás
		  [OneWay]
		  void Show(string name, string message);
	 }

	 public interface IChatServer {
		  void LogIn(string name, IChatClient client);
		  void LogOut(string name);
		  void Send(string name, string message);
	 }
}

Server / Program.cs

namespace Server
{
	 class ChatServer: MarshalByRefObject, IChatServer
	 {
		  Dictionary<string, IChatClient> clients = new Dictionary<string, IChatClient>();
		  ReaderWriterLock rwl = new ReaderWriterLock();

		  public void LogIn(string name, IChatClient client)
		  {
				rwl.AcquireWriterLock(100);
				clients[name] = client;
				rwl.ReleaseLock();
		  }

		  public void LogOut(string name)
		  {
				rwl.AcquireWriterLock(100);
				clients.Remove(name);
				rwl.ReleaseLock();
		  }

		  public void Send(string name, string message)
		  {
				rwl.AcquireReaderLock(100);
				foreach (string key in clients.Keys)
					 if (key != name)
						  clients[key].Show(name, message);
				rwl.ReleaseLock();
		  }

		  // a szerver akkor se szűnjön meg, ha sokáig nem érkezik kérés
		  public override object InitializeLifetimeService()
		  {
				return null;
		  }
	 }

	 class Program
	 {
		  static void Main(string[] args) {
				// callback engedélyezése
				BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider();
				provider.TypeFilterLevel = TypeFilterLevel.Full;
				IDictionary props = new Hashtable();
				props["port"] = 9000;

				TcpChannel channel = new TcpChannel(props, null, provider);
				ChannelServices.RegisterChannel(channel);
				// Singleton: egy példány jön létre és megtartja az állapotát a hívások között
				RemotingConfiguration.RegisterWellKnownServiceType(
					 typeof(ChatServer), "IChatServer", WellKnownObjectMode.Singleton);
				// A szerver csak addig tud aktiválni, amíg fut
				Console.ReadLine();
		  }
	 }
}

Client / Program.cs

namespace Client
{
	 class ChatClient : MarshalByRefObject, IChatClient
	 {
		  public void Show(string name, string message) {
				Console.WriteLine("{0} : {1}", name, message);
		  }

		  // a kliens akkor se szűnjön meg, ha sokáig nem érkezik kérés
		  public override object InitializeLifetimeService() {
				return null;
		  }
	 }

	 class Program
	 {
		  static void Main(string[] args) {
				// A kliens a szerverrel felépített TCP kapcsolaton keresztül hívható
				TcpChannel channel = new TcpChannel(0);
				ChannelServices.RegisterChannel(channel);

				IChatServer ics = (IChatServer)Activator.
					 GetObject(typeof(IChatServer), "tcp://lab52000:9000/IChatServer");

				ics.LogIn(args[0], new ChatClient());
				for (string msg = ""; msg != "bye"; )
					 ics.Send(args[0], msg = Console.ReadLine());
				ics.LogOut(args[0]);
		  }
	 }
}

-- Peti - 2006.04.21.