Remoting und Objektübergabe

Alphamännchen

Mitglied
Ich hätte da mal folgendes Problem ...

Nach dem sehr guten Tutorial, wie man einen Chat Server programmiert und der in diesem Forum gewonnenen Erkenntnis, wie man von einer DLL heraus auf die Textausgabeelemente der Eingabemaske zugreift, möchte ich diese Erkenntnisse nun verbinden.

Sprich, ich habe einen Chat Server programmiert, bei dem die jeweiligen Server- und Client Objekte in seperate DLL's abgelegt wurden. Soweit kein Problem. Programm funktioniert ordnungsgemäß.

Jetzt versuche ich jedoch vom Server Objekt (DLL) auf die Eingabemaske des Servers (separat in einer eigenen Klasse) zuzugreifen. Dies klappt insofern nicht, als das ich der ServerDLL kein Objekt meines Servers übergeben kann, da dieses beim Remoting anscheinend nur ohne überladenen Konstruktor übergeben werden kann:

Code:
RemotingConfiguration.RegisterWellKnownServiceType(typeof(ServerObject), "chat.rem", WellKnownObjectMode.Singleton);

WIe kann man diese Proble lösen, sprich wenn der Client eine Remoting Server Methode aufruft, ich auch gleichzeitig auf der Eingabemaske des Servers eine Message erhalte.

WIe gesagt Server und ServerObjet sind nicht im selben Projekt ...
 
Versteh ich jetzt nicht ganz ... Der Client sollte ja eigentlich gar nix am Server ausgeben dürfen. Zumindest wäre das irgendwie schon grob fahrlässig und wäre auch net besonders sauber.

Dir ist aber auch klar, dass Du die DLL nicht für was anderes verwenden kannst, wenn Du auf andere Textfelder etc. zugreifst?

Du schickst dem Server was, der liest ein und gibt selber aus - kein passender Weg?
 
Mir geht es darum, dass der Server beispielsweise die IP vom Client in einer Listbox ausgibt.

Über eine Konsole ist das ganze kein Problem, aber mit Windows.Forms, muss die DLL das Objekt kennen, auf dem die Ausgabe erfolgen soll.
 
Wieso?

Der Client muss ja mit dem Server kommunizieren. Und in der Session übergibst zb die IP. Die wird vom Server dann entsprechend ausgegeben. Es macht keinen Sinn, wenn der Client das in der TextBox (oder was auch immer für ein Control) ausgibt ....
 
Sorry, ich glaube ich habe mich schwer verständlich ausgedrückt, also:

Ich habe eine Datei: Server.cs
und ein dazugehöriges Objekt ServerObjekt.dll
dann natürlich noch eine Datei Client.cs und ein Interface auf das sowohl der Server, als auch der Client Zugriff haben.

Wenn ich jetzt alles mit dem Romoting richtig verstanden habe, dann greift der Client über das Interface auf die ServerObject.dll zu und führt die dort stehende Methode auf dem Server aus und gibt wenn gefordert einen Wert zurück.

Beim Clientseitigen Methodenaufruf, kann ich natürlich die Client IP (beispielsweise als einfachen String).

Mein Problem ist nun, dass vom ServerObjekt (ServerObjet.dll) eine ListBox in der Form von Server.cs angesprochen werden soll und dort die Client IP ausgegeben werden soll.

Mit ConsoleWriteLine ist das kein Problem, jedoch kann ich das Objet der Serverform nicht übergeben --> keine Ausgabe auf der Serverform möglich.
 
Hi,

das Problem hatte ich auch. Ich habs folgendermaßen gelöst :
Du meldest ja den Service an(stellst also das Server-Objekt über die TCP-Verbindung bereit). Dann erstellst du in der darauffolgenden Zeile einfach eine Instanz von diesem Remotingobjekt, genauso wie du es beim Client machst. Das Server-Objekt sollte zusätzlich eine Methode wie etwa ServerLogin() enthalten, von der nur der Server weis, dass sie existiert. Diese Methode rufst du dann auf und übergibst ihr als Parameter einen Verweis auf deine Textbox oder ähnliches, die natürlich public sein muss. Dann kennt das Server-Objekt die Box, wo es etwas ausgeben kann.

Hoffe dir geholfen zu haben, MfG
 
Angenommen die Textbox, in der die Logausgabe erfolgen sollen, ist eine RichTextBox mit dem Namen rtbLog :
Code:
RemotingConfiguration.RegisterWellKnownServiceType(typeof(ServerObject), "chat.rem", WellKnownObjectMode.Singelton);
ServerObject _myServer = (ServerObject)Activator.GetObject(typeof(ServerObject), "tcp://localhost:1234/chat.rem");
string strServerPwd = "passwort";
_myServer.ServerLogin(strServerPwd, this.rtbLog); // einloggen als Server und Übergabe des Verweises

MfG
 
Klappt augezeichnet (Hätte selber drauf kommen müssen, aber manchmal sieht man halt den Wald vor lauter Bäumen nicht ....

DANKE
 

Neue Beiträge

Zurück