C#-Projekt: Client/Server

Heute bin ich einen guten Schritt weitergekommen bei meinem C#-Projekt. Der grundlegende Aufbau der Client-/Server-Kommunikation steht. Nach einigem Hin und Her bin ich nun an einem Punkt angelangt, an dem ich mir über die grundsätzlichen Abläufe der Kommunikation keine Gedanken mehr machen muss, sondern endlich mit der Implementierung der eigentlichen Berechnungen beginnen kann. Ich habe die Anwendung nun grob wie im folgenden Klassendiagramm dargestellt gestaltet.

Klassendiagramm Client/Server

Es gibt also 4 Assemblys, die die Klassen auf dem Server und dem Client enthalten, die benötigten Interfaces und einige Konstanten (wie Geschlecht oder Dateitypen). Der Server wird über das Formular formServer gestartet, wobei auch gleichzeitig der TCPChannel erstellt wird und zwei Objekte (Server und Dateiformat) veröffentlicht werden:
public void ServerStarten() { try { this.cfg.ReadFile(); BinaryServerFormatterSinkProvider provider = new BinaryServerFormatterSinkProvider(); provider.TypeFilterLevel = System.Runtime.Serialization.Formatters.TypeFilterLevel.Full; IDictionary props = new Hashtable(); props["port"] = Convert.ToInt32(this.cfg.sections["Netzwerk"].settings["TcpPort"].value); this.chan = new TcpChannel(props, null, provider); ChannelServices.RegisterChannel(this.chan); // Remote-Objekte bereitstellen RemotingConfiguration.RegisterWellKnownServiceType(typeof(Server), this.cfg.sections["Endpunkte"].settings["Server"].value, WellKnownObjectMode.Singleton); RemotingConfiguration.RegisterWellKnownServiceType(typeof(Dateiformat), this.cfg.sections["Endpunkte"].settings["Dateiformat"].value, WellKnownObjectMode.SingleCall); this.IstGestartet = true; Log.Instanz.LadeKonfiguration(this.cfg); Log.Instanz.LogNachricht("Server gestartet"); } catch (Exception ex) { this.ServerStoppen(); throw new Exception("Server konnte nicht gestartet werden!\nMeldung: " + ex.Message); } }

Der Client kann sich nun ebenfalls per Formular verbinden:
this.chan = new TcpChannel(0); ChannelServices.RegisterChannel(this.chan); IServer server = (IServer)Activator.GetObject( typeof(IServer), "tcp://" + this.cfg.sections["Netzwerk"].settings["Server"].value + ":" + Convert.ToInt32(this.cfg.sections["Netzwerk"].settings["TcpPort"].value) + "/" + this.cfg.sections["Endpunkte"].settings["Server"].value); this.server = server as IServer; this.IstVerbunden = false; this.IstVerbunden = this.server.ClientAnmelden(Dns.GetHostName());

Danach steht ihm das Remote-Objekt Server zur Verfügung. Des Weiteren werden nun die “Berechnungen” durchgeführt, indem die benötigten Objekte instantiiert und die entsprechenden Methoden aufgerufen werden. Ein Beispiel sei folgende Methode, die eine Combobox auf dem Formular formImportKommutationswerte mit dynamischen Werten aus der Klasse Dateiformat füllt:
public void FormularVorbereiten(FormImportKommutationswerte form) { IDateiformat df = (IDateiformat)Activator.GetObject( typeof(IDateiformat), "tcp://" + this.cfg.sections["Netzwerk"].settings["Server"].value + ":" + Convert.ToInt32(this.cfg.sections["Netzwerk"].settings["TcpPort"].value) + "/" + this.cfg.sections["Endpunkte"].settings["Dateiformat"].value); form.LadeDateiformate(df.ListeDateiformate(Konstanten.Dateitypen.KommutationswerteExcel)); }

Gar nicht so schwer, oder? 😉

Über Stefan

Polyglot Clean Code Developer

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax