[de] ChatBeispielprojekt (solved)

Topics: Technical Support
May 25, 2011 at 6:22 PM

Hi Rainbird,

auf der Suche nach einer Kommunikationskomponente bin ich in auf codekicker.de auf Zyan aufmerksam gemacht worden. Ich arbeite mit VB.NET, Visaul Studio 2010 und .NET Framework 4 und habe den Bedarf, dass sich die auf unterschiedlichen Rechnern laufenden Instanzen meines Programmes gegenseitig über geänderte Daten informieren müssen - also eigentlich genau das, was Zyan schon anbietet. Überhaupt bin ich von den Features des Framworks begeistert, auch wenn ich mir die Dinge mangels Detailwissen in Remoting und ähnlichem technisch nur begrenzt vorstellen kann.

Das ChatBeispielprogramm macht praktisch schon alles was ich brauche (abgesehen von der benötigten Anpassung zu verteilender Daten), doch leider bin ich mit der Originalversion MiniChat gescheitert:

  • nach Lesen der Doku habe ich die in diesem Projekt gefundenen "localhost" (an 6 Stellen) gegen die meine Server-IP-Adresse getauscht und das Projekt neu kompiliert.
  • Starte ich dann mehrere Clients am Server-Computer werden die versandten Nachrichten auch fein verteilt.
  • Ein auf einem anderen Rechner gestarteter Client schafft zwar noch den Versand der Nachricht (diese taucht bei den restlichen Clients auf), stirbt aber unmittelbar danach mit einem Fehler in der Zyan.Communication.dll:

Server stack trace:
   at Zyan.Communication.ZyanDispatcher.Invoke(Guid trackingID, String interfaceName, List`1 delegateCorrelationSet, String methodName, ParameterInfo[] paramDefs, Object[] args)
   at System.Runtime.Remoting.Messaging.StackBuilderSink._PrivateProcessMessage(IntPtr md, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs)
   at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
Exception rethrown at [0]:
   bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   bei Zyan.Communication.IZyanDispatcher.Invoke(Guid trackingID, String interfaceName, List`1 delegateCorrelationSet, String methodName, ParameterInfo[] paramDefs, Object[] args)
   bei Zyan.Communication.ZyanProxy.InvokeRemoteMethod(IMethodCallMessage methodCallMessage)
Exception rethrown at [1]:
   bei System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   bei System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   bei Zyan.Examples.MiniChat.Shared.IMiniChat.SendMessage(String nickname, String text)
   bei Zyan.Examples.MiniChat.Client.ChatForm.<_sendButton_Click>b__0(Object x) in S:\ASOFTWARE\Individualprojekte\Remoting Zyan\Zyan.Examples.MiniChat\Zyan.Examples.MiniChat.Client\ChatForm.cs:Zeile 44.
   bei System.Threading.QueueUserWorkItemCallback.WaitCallback_Context(Object state)
   bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   bei System.Threading.QueueUserWorkItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
   bei System.Threading.ThreadPoolWorkQueue.Dispatch()
   bei System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

 Nun hätte ich ein paar Fragen:

  • Ist das ChatBeispielprogramm überhaupt für die Verwendung auf mehreren Rechnern vorgesehen?
  • Ist dafür noch etwas anderes zu machen als wie erwähnt die Server-IP-Adresse einzutragen?
  • Sollte ich mir vor weiteren Versuchen die Beta der Zyan 2.0 holen und im Projekt einsetzen?
  • Ich nehme zwar an, dass ich die dll's auch aus einem VB.Net-Projekt nützen kann, aber gibt es diesbezüglich vielleicht schon Erfahrung?


Wie auch immer dein Kommentar ausfällt, ich bedanke mich schon im Voraus für eine Antwort,
beste Grüße aus dem endlich sommerlich warmen Wien.

Robert 

Coordinator
May 26, 2011 at 9:43 PM

Hallo Robert,

> Sollte ich mir vor weiteren Versuchen die Beta der Zyan 2.0 holen und im Projekt einsetzen?

Du solltest die aktuelle Code-Version aus dem Repository verwenden. Die 2.0 Final-Version steht kurz vor der Fertigstellung. Du kannst die aktuelle Code-Version hier runterladen: http://zyan.codeplex.com/SourceControl/list/changesets.

Mit der aktuellen Code-Version solltest Du keine Probleme mehr haben (Falls doch bestimmt keine, die wir nicht gemeinsam lösen könnten). Zyan 2.0 unterstützt bi-direktionale Kommunikation und kann Events und Callbacks senden, ohne dafür Löcher in die Client-Firewall zu machen. Ein aktualisiertes Chat-Beispiel findest Du im ordner examples\Zyan.Examples.MiniChat.
In dem aktualisierten Beispiel musst Du nur den URL in der App.config des Clients anpassen.

Hier findest Du eine kurze Übersicht (allerdings in Englisch) über Neuerungen von Zyan 2.0: http://zyan.codeplex.com/wikipage?title=What%c2%b4s%20new%20in%20Zyan%202.0%3f&referringTitle=English%20Documentation

> Ist das ChatBeispielprogramm überhaupt für die Verwendung auf mehreren Rechnern vorgesehen?

Ja, definitiv. Das Beispiel funktioniert mit Zyan 2.0 auch im Internet durch die Client-Firewall hindurch (Nur am Server muss Port-Forwarding eingerichtet werden). Ich hab das Beispiel im LAN und übers Internet (DSL-Anbindung) getestet.

> Ist dafür noch etwas anderes zu machen als wie erwähnt die Server-IP-Adresse einzutragen?

Wenn Du mit Events/callbacks durch Client-Firewalls musst ist es wichtig, dass Du das TcpDuplexClientProtocolSetup bzw. TcpDuplexServerProtocolSetup verwendest.

> Ich nehme zwar an, dass ich die dll's auch aus einem VB.Net-Projekt nützen kann, aber gibt es diesbezüglich vielleicht schon Erfahrung?

Zyan sollte ohne Probleme mit VB.NET funktionieren. Du musst nur die Zyan.Communication.dll als Verweis zufügen. In den Unterverzeichnissen "de" und "ru" befinden sich nur die Satelitten-Assemblies für Deutsche und Russische Lokalisierung. Wenn Du LINQ-Abfragen übers Netzwerk ausführen willst, benötigst Du noch zusätzlich die Zyan.InterLinq.dll.

Wenn Du etwas genauer aufskizzierst, was Du genau machen willst, kann ich vielleicht die eine oder andere Empfehlung abgeben, wie sich das mit Zyan umsetzen lässt.

Gruß

Hagen Siegel

May 27, 2011 at 11:20 PM
Edited May 27, 2011 at 11:29 PM

Hi Hagen,

vielen Dank für deine Rückantwort - deine rasche Reaktion und die Fuktionlaitäten von Zyan ermutigen mich, meine Anforderungen mit Zyan umzusetzen.

In meinem Projekt werden auf unterschiedlichen Clients Aufträge erfasst. Dabei soll sich aber eine Liste aller erfassten Aufträge auf allen beteiligten Clients aktualisieren. Die Auftragsdichte ist momentan nicht so hoch, als das wir das derzeit nicht über die Drehscheibe Datenbank machen könnten. Auf diese Art und Weise produzieren wir aber unnötige Datenbank- und Netzwerklast - und ich bin kein Freund socher Overheads ohne Aussicht auf Skalierung.

Ich bin momentan noch überwiegend im Mobil-Client Part des Projekts unter WinCe gebunden, werde mich aber nächste Woche noch einmal mit dem Chat-Programm beschäftigen, das ja grundsätzlich schon die Basis für meine Lösung darstellt. Grundsätzlich habe ich den Aufbau des Chat-Programms schon bei erster Durchsicht ganz gut verstanden - bei Problemen würde ich aber natürlich gerne auf dein Angebot zurückkommen. Im besten Fall gebe ich Feedback über eine erfolgreich Umsetzung :-)

Ciao,
Robert

Coordinator
May 28, 2011 at 1:34 AM

Hallo Robert,

Zyan benötigt mindestens das .NET Framework 3.5 Client Profile. Wenn Dein Client WinCe ist, ist dort doch nur das .NET Compact Framework verfügbar, oder? Auf dem Compact Framework läuft Zyan nicht, da dort wichtige Klassen wie z.B. der BinaryFormatter fehlen, die Zyan benötigt. Du solltest deshalb prüfen, ob Du wirklich das benötigte "große" .NET Framework zur Verfügung hast.

Für Compact Framework Clients müsstest Du serverseitig eine Fassade mit einem SOAP-Webdienst aufsetzen.

Es gibt eine kostenpflichtige (ca. 200$) Library eines Drittherstellers, welche .NET Remoting fürs Compact Framework verfügbar macht: http://gotcf.net/ 
Damit könnte es - mit einigen Anpassungen und Kompromissen - möglich sein eine Zyan-Version fürs Compact Framework zu erstellen.

Solltest Du Dich wirklich mit dem Compact Framework rumschlagen müssen, helfe ich bei einer Anbindung an Zyan über dieses Drittanbieter-Framework gerne weiter. 

Gruß

Hagen Siegel

May 28, 2011 at 2:49 PM
Edited May 28, 2011 at 3:09 PM

Hallo Hagen,

nach sommerlicher Woche regnet es in Wien wochenendgemäß :-(

Aber immerhin hatte ich dadurch die Möglichkeit, das Zyan ChatBeispielprogramm noch einmal zu probieren! Ich habe vermutlich zu unklar formuliert, aber ich habe Zyan nicht für die angesprochene Mobilsolution vorgesehen - diese hält mich momentan nur auf, den Intranetteil des Projektes zu realisieren. Ich brauche Zyan also nur im lokalen Netzwerk, auf Windows XP, Vista & 7 Clients mit .net Framework 4.

Und genau das habe ich gerade mit der aktuellen Codeversion getan, die ich nach deiner Empfehlubng natürlich geholt habe. Während ChatServer problemlos startete, bekam ich beim ChatClient eine System.IO.FileNotFoundException:
{"Could not load file or assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. Das System kann die angegebene Datei nicht finden.":"System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"}
(und zwar in Zyan.Communication.ZyanProxy.cs, Zeile 154 beim Abonnieren des Ereignisses der Serverkomponente: _connection.RemoteComponentFactory.AddEventHandler(_interfaceType.FullName, correlationInfo);)

Zur Behebung habe ich in in der gesamten MiniChat-Solution das Zielframework zuerst auf .NET Framework 4 Client Profile umgestellt - derselbe Fehler.

Dann habe ich das Zielframework auf .NET Framework 4 geändert, und siehe da: nun geht's. Auch über verschiedene Rechner, also wiklich physikalisch andere PCs, wie auch über meine unter vmWare laufenden virtuellen Entwicklungs- und Testmaschinen. Ich habe auch auf einer nakten Win7/64 Maschine das dotNetFx40_Full Setupt wie auch das Platform Runtime Update 1 ausgeführt und auch hier passt alles :-)

Das schaut wiederum gut für mich aus, denn ich hab kein Problem damit, als Zielframework .NET Framework 4 zu verwenden (meine Solution verwendet das sowieso, da ich auch die TPL verwenden möchte). Aber vielleicht ist das für dich wichtig, denn auf der Win7/64 Maschine hatte ich ursprünglich nur .Net Framework 3.5 Client Profile installiert, und da ging's nicht. Oder liegt das nur daran, dass ich mit VS10 arbeite und kompiliert habe?

Wie auch immer, ich bin begeistert und nächste Woche werde ich mich also damit beschäftigen, die MiniChat-Funktionalität in VB.NET zu schreiben wie auch die Interfaces für meine zu verteilenden Klassen.

In jedem Fall halte ich dich auf dem laufenden und danke noch einmal für dein rasches Feedback!

Also war's gut, dass es geregnet hat ;-)
Freu mich jetzt schon auf einen spannenden Fussball Abend mit dem Champions League Finale :-)

Ciao, Robert

Coordinator
May 28, 2011 at 11:05 PM

Hallo Robert,

der Fehler wird vermutlich von der Versionsangabe innerhalb des Tags "sectionGroup" in der App.config ausgelöst. Schau mal:

<sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
    <section name="Zyan.Examples.MiniChat.Server.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, ulture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
</sectionGroup>



Durch das umstellen des Zielframeworks wird die App.config nicht aktualisiert.

Lösung: Versionsangaben in den App.configs bei Zielframework 3.5 auf 2.0.0.0 ändern.

Ist also kein Zyan Problem.

Gruß

Hagen

Coordinator
May 28, 2011 at 11:22 PM

Noch ein Tipp. Events sind zwar am einfachsten zu implementieren, aber ich empfehle trotzdem einzelne Delegates zu verwenden (Client ruft Subscribe-Funktion auf und übergibt Delegate). Über einzelne Delegates hast Du die volle Kontrolle und kannst z.B. selber entscheiden, wie sich Dein Server verhalten soll, wenn ein Client nicht erreichbar ist. Bei Events wird der Client kurzerhand einfach gekickt. Außerdem werden bei Events alle Clients nacheinander benachrichtigt. Bei vielen Clients kann sich die Zustellung der Benachrichtigungen also verzögern. Einzelne Delegates kannst Du per Multithreading parallel ansprechen. Das ist performanter.

Gruß

Hagen