Laden...

Remoting

Erstellt von cmpxchg vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.236 Views
C
cmpxchg Themenstarter:in
192 Beiträge seit 2005
vor 18 Jahren
Remoting

Hallo ich hab ein problem mit .NET remoting. Jetzt kommt erstmal der Sourcecode den ich hab:


class Server
{
		[STAThread]
		static void Main(string[] args)
		{
			Console.Out.WriteLine("Starting Server");
			Console.Out.WriteLine("Creating Mainclass");
			Server mainclass = new Server();
			Application.Run();
		}

                Server()
		{

			ChannelServices.RegisterChannel(new TcpServerChannel(8123));

		
			RemotingConfiguration.RegisterWellKnownServiceType( typeof(Remoteclass), "remoteclass.rem", WellKnownObjectMode.SingleCall );
		}
}


class Remoteclass : MarshalByRefObject
{
	void DoSomething()
	{
		Console.Out.Write("Hallo");
	}
}

class Clientclass
{
		[STAThread]
		static void Main(string[] args)
		{
			Application.Run(new Clientclass());	
		}

		Clientclass()
		{
			ChannelServices.RegisterChannel(new TcpClientChannel());
			Remoteclass remclass = (Remoteclass)  Activator.GetObject( typeof(Remoteclass), "tcp://localhost:8123/remoteclass.rem");

			Remoteclass.DoSomething();
		}

}

So soweit so gut, funktioniertes es ja. Der Client veranlasst den Server ein Objekt vom Typ Remoteclass zu erzeugen. Der Client führt auch die funktionen aus u.s.w. Ich will aber jetzt Serverseitig auch Methoden dieser Remoteclass-instanz ausführen, was muss man da machen?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo cmpxchg,


class Remoteclass : MarshalByRefObject
{
    void DoSomething()
    {
        Console.Out.Write("Hallo");
        DoOtherthing ()                // <== hier
    }

    void DoOtherthing()
    {
        Console.Out.Write("Hello");
    }
}

Oder meinst du was anderes?

herbivore

P
939 Beiträge seit 2003
vor 18 Jahren

Ich denke es geht darum, dass die Anwendung auf dem Server an die Referenz eines registrierten Service-Objekts kommen soll. Lokal sozusagen.

Das geht aber in zweierlei Hinsicht nicht. Zum einen ist es ein SingleCall-Service (wer J2EE kennt, entspricht einen "Stateless Session Bean"). Weil der SingleCall-Service keinen Zustand speichert, macht es auch keinen Sinn sich ein bestimmtes Objekt zu holen. Sie sind alle gleich und können wiederverwendet werden. Es gibt einen Pool, in dem "gebrauchte" SingleCall-Objekte gecached werden.

Und zweitens, selbst bei einem Singleton-Service bekommt die Server-Anwendung keinen "lokalen" Zugriff auf das Objekt. Sie muss sich auch die "Proxy"-Referenz holen, genauso wie es der Client tut. (Es wird ja die Klasse als "WellKnown" registriert und nicht ein spezielles Objekt, das man noch lokal referenziert haben könnte.)

Registrierte Services können also nur remote aufgerufen werden. Befinden sich Client und Service auf dem selben Rechner, können die Kommunikationswege optimiert werden. Ich glaube statt TCP/IP kommt dann COM+ zum Einsatz, bin mir aber nicht sicher.

Gruss
Pulpapex

C
cmpxchg Themenstarter:in
192 Beiträge seit 2005
vor 18 Jahren

Ok, was mache ich, wenn ich so typische Server-Sachen programmieren will.

Mal angenommen jeder Client erzeugt ein Objekt, das seinen Benutzernamen zur Authentifizierung in einem public string speichert. Der Server soll jetzt alle 10 min einmal alle Benutzernamen in eine Datei speichern. Wie findet den der server die Benutzernamen aller Clients raus?

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo cmpxchg,

kein Problem. Nur musst du es umdrehen.

er Client erzeugt ein Objekt, das ja dann auf dem Server läuft und dort seine Information in eine zentrale Liste eintragen kann, z.B. per static-Methode seiner Klasse. Eine weiter static-Methode könne dann die Liste in die Datei schreiben. Diese Methode kann von ein Timer in dem Server-Prozess aufgerufen werden.

herbivore