myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Gemeinschaft » .NET-Komponenten und C#-Snippets » PS Remoting Interface
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

PS Remoting Interface

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.244
Entwicklungsumgebung: Visual Studio 2010 Express


inflames2k ist offline

PS Remoting Interface

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

PS Remoting Interface
Aktuelle Version: 1.1.4882.38692
Unterstützte Betriebssysteme: Windows XP - Windows 7 - Windows 8
Benötigte .NET Framework Version: 2.0
Downloads bis zum letzten Update: 93

Beschreibung:

Das PS.Remoting.Interface ist eine kleine Bibliothek, welche die Arbeit mit .NET Remoting vereinfachen soll. Ich habe sie erstellt, da ich es leid bin immer und immer wieder Server und Client Klassen zu erstellen / nach Copy&Paste zu ändern.

Die Funktionsweise ist relativ simpel. Zum öffnen einer Verbindung sind lediglich 3 Codezeilen notwendig:

C#-Code:
RemotingServer<MyProvidedType> server = new RemotingServer<MyProvidedType>();
server.ConfigFile = "ConfigFile_Remoting.xml";
// opens the connection and marshalls the interface
server.Open();

MyProvidedType aus dem oben genannten Beispiel muss von RemotingObject<T> erben, wobei T MyProvidedType selbst ist. Dies hat den Hintergrund, dass MyProvidedType somit automatisch zum Singleton wird. MyProvidedType wäre die Klasse, über die der Client über das Interface Zugriff auf den Server erlangt.

Eine Beispielklasse, wie sie auch im Testprojekt enthalten ist:

C#-Code:
[Serializable]
public class ServerBusinessClass : RemoteObject<ServerBusinessClass>
{
    public void SaveToFile(string text, string file)
    {
        File.WriteAllText(file, text);
    }
}

In meinem Beispiel soll der Server nach Aufruf lediglich einen Text in eine Datei schreiben.

Allerdings wollen wir ja auch eine Schnittstelle haben, über die der Client zugriff hat.

Auch dies gestaltet sich ziemlich einfach. Wir erstellen eine Interface Klasse, die die Zugriffe auf das RemoteObjekt vornimmt. Dieses erbt wiederum von einer generischen Klasse, dem RemotingInterface<T>.

Unsere Klasse sieht anschließend wie folgt aus:

C#-Code:
[Serializable]
public class ServerInterface : RemotingInterface<ServerBusinessClass>
{
    #region IServerInterface Member

    public void Save(string text, string file)
    {
        this.RemotingObject.SaveToFile(text, file);
    }

    #endregion
}

Der Cloue ist, dass RemotingObject hier bereits vom Typ ServerBusinessClass ist. Somit können wir die SaveFile Methode aufrufen.

Nun würde der Server allein schon arbeiten. Um nun eine Verbindung mit dem Server herzustellen sind wiederum wenige Zeilen Code auf Clientseite notwendig:

C#-Code:
RemotingClient<ServerBusinessClass> client = new RemotingClient<ServerBusinessClass>();
client.ServerUrl = "tcp://myserver:myPort/RemoteInterface.rem";
client.Connect();

Auf diese Weise können wir nun eine Verbindung mit dem Server herstellen, und haben auch schon Zugriff auf das Server-Interface.
Wir können nun die Methode "Save" wie folgt aufrufen:

C#-Code:
ServerInterface iInterface = client.Interface as ServerInterface;
iInterface.Save("MyText", "MyFile.txt");

Release Log:

21.10.2011 Version 1.0 veröffentlicht
14.05.2013 Version 1.1 Erweitert um Events zu ermöglichen

Auch wenn ich es angekündigt habe, werde ich auf die Verwendung von Events nicht eingehen. Das Testprojekt wird dies ausreichend zeigen.

Schlagwörter: Remoting, Netzwerkprogrammierung, .NET Remoting, Client-Server-Verbindung, Client-Server


Dateianhang:
unknown PS.Utilities.Remoting_V1.1_20130514.zip (4,46 KB, 221 mal heruntergeladen)

Dieser Beitrag wurde 7 mal editiert, zum letzten Mal von inflames2k am 14.05.2013 22:33.

21.10.2011 14:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.244
Entwicklungsumgebung: Visual Studio 2010 Express

Themenstarter Thema begonnen von inflames2k

inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Anbei noch das Testprojekt

Bisherige Downloads: 94


Dateianhang:
unknown PS.Utilities.RemotingTest.zip (93,36 KB, 211 mal heruntergeladen)

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von inflames2k am 14.05.2013 22:35.

21.10.2011 14:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegt mehr als ein Jahr.
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.244
Entwicklungsumgebung: Visual Studio 2010 Express

Themenstarter Thema begonnen von inflames2k

inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Da ich es jetzt doch selbst brauchte, habe ich das Projekt ein wenig erweitert. Mit kleinen Anpassungen ist jetzt auch die Verarbeitung von Events, die durch den Server gesendet werden möglich. Die Aktuelle Version ist 1.1.*.

Damit keine Fragen oder Beschwerden auftauchen, die Grundlegende Lösung habe ich mir bei  .NET Remoting Events Explained abgeschaut.

Die einzige Änderung ist eigentlich, das der TCP-Channel im RemotingClient nun etwas anders aufgebaut wird. Und zwar wie in dem CodeProject Sample über BinaryServerFormatterSinkProvider und die BinaryClientFormatterSinkProvider um den TypeFilterLevel auf Full zu setzen.

Dieser Beitrag wurde 4 mal editiert, zum letzten Mal von inflames2k am 14.05.2013 22:44.

14.05.2013 22:28 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 5 Monate.
ErfinderDesRades
myCSharp.de-Poweruser/ Experte

avatar-3151.jpg


Dabei seit: 31.01.2008
Beiträge: 5.298


ErfinderDesRades ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hi!

Ich probiere damit grad rum, und mach mir Sorgen wegen der Resourcenbereinigung im Server.
Anscheinend kann sich ein Client nicht wirksam disconnecten - folgender Code remoted fröhlich weiter:

C#-Code:
using System;
using PS.Utilities.Remoting;
using TestCommon;
using System.Runtime.Remoting;
using System.Runtime.Remoting.Channels;

namespace PS.Utilities.Remoting.TestClient {
   class Program {
      public static void Main(string[] args) {
         string sInput = string.Empty;
         EventProxy eventProxy = new EventProxy();
         eventProxy.FileWritten += new FileWrittenEventHandler(eventProxy_FileWritten);

         RemotingClient<ServerBusinessClass> client = new RemotingClient<ServerBusinessClass>();
         client.ProtocolRef = "tcp";
         client.HostName = "localhost";
         client.Port = 12345;
         client.RemoteInterface = "RemotingInterface.rem";
         client.Connect();
         client.CheckConnection();

         ServerInterface iInterface = client.Interface as ServerInterface;
         client.Disconnect();          //interessiert die Funktionalität von iInterface nicht die Bohne
         iInterface.FileWritten += new FileWrittenEventHandler(eventProxy.HandleFileWrittenEvent);
         iInterface.Save("Hallo Welt2!", "Test2.txt");
         Console.ReadLine();
      }

      static void eventProxy_FileWritten() {
         Console.WriteLine("File written");
      }
   }
}

Das bedeutet, das trotz des disconnectens des Clients beim Server iwas übrigbleibt, was Befehle entgegennimmt, oder täusche ich mich?
26.10.2013 09:07 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.244
Entwicklungsumgebung: Visual Studio 2010 Express

Themenstarter Thema begonnen von inflames2k

inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Muss ich mir dann mal ansehen, wenn ich zu Haus bin. Korrekt ist natürlich, das nach dem Disconnect keine Zugriffe mehr über das Interface möglich sein sollten.

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von inflames2k am 28.10.2013 16:27.

28.10.2013 16:27 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
inflames2k inflames2k ist männlich
myCSharp.de-Poweruser/ Experte

avatar-3407.gif


Dabei seit: 03.01.2010
Beiträge: 2.244
Entwicklungsumgebung: Visual Studio 2010 Express

Themenstarter Thema begonnen von inflames2k

inflames2k ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo ErfinderDesRades,

wenn ich den Informationen folge, die mir das WorldWide-Web bringt, ist der Disconnect bei Remoting-Proxies so garnicht vorgesehen.

Da das Interface auf Serverseite Singleton ist, antwortet es natürlich auf eingehende Nachrichten auf dem Port. - Der Fehler liegt also ganz klar im Disconnect des Clients. Dieses ist quasi überflüssig.

Da es aber jetzt geringe Priorität hat, dieses rauszunehmen, werde ich es erstmal dabei belassen.

Korrigiert mich bitte, wenn ich irgendetwas falsches geschrieben habe.
05.11.2013 18:22 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 9 Jahre.
Der letzte Beitrag ist älter als 7 Jahre.
Antwort erstellen


© Copyright 2003-2021 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 20.01.2021 08:51