Sollte ich WCF oder rohe Sockets verwenden?

8

Ich möchte eine Client-Server-Anwendung in .NET entwickeln, die wie folgt funktioniert:

  1. Clients stellen eine Verbindung zu einem zentralen Server her. Der Server muss verfolgen, welche Clients eine Verbindung herstellen, und er muss nur diejenigen zulassen, die er kennt (ich habe ein Repository mit zulässigen Clients). Dies ist, weil in meiner Anwendung es wichtig ist zu wissen, wer alle in einer bestimmten Instanz vorhanden sind.
  2. Die Clients könnten mit anderen Geräten verbunden sein, zum Beispiel über LAN / USB / Serielle Schnittstellen. Der Server sollte diese verbundenen Geräte über den Client steuern können. Angenommen, der Client ist mit einer Kamera verbunden. Der Server sollte in der Lage sein, die Kamera zu einem bestimmten Zeitpunkt einzuschalten und dann die Bilder zurück zu erhalten (oder den Client dazu zu bringen und das Ergebnis auf den Server hochzuladen).
  3. Ich möchte auch, dass diese Clients benutzerdefinierte ausführbare Dateien ausführen und das Ergebnis erhalten. Zum Beispiel sendet der Server eine Anwendung an den Client (oder ruft einige vorhandene auf), lässt ihn vom Client ausführen und erhält die resultierenden Daten zurück.

Ich frage mich nur, ob ich WCF für diesen Zweck verwenden kann, oder sollte ich mit guten alten Sockets gehen. Obwohl das anfängliche Netzwerk klein sein würde, möchte ich es skalieren (1000 Clients). Jeder Vorschlag würde sehr geschätzt werden.

    
Andy 24.07.2010, 16:22
quelle

4 Antworten

2

Heute würde ich niemals auf ein so niedriges Level wie Sockets gehen, es sei denn, du musst es wirklich tun. Arbeiten mit Abstraktionen auf hohem Niveau ist viel produktiver und kreativer. Besser 2-3 Tage damit verbringen, WCF oder .Net Remoting zu lernen, dann 2 Wochen Debugging von Low-Level-Socket-Sachen.

Vor ein paar Wochen hatten wir eine ähnliche Entscheidung getroffen. Wir haben uns für Remoting entschieden, da Sie auf Objektebene arbeiten können, es ist verdammt einfach einzurichten und recht effizient. Wir hätten WCF verwenden können, aber es war nicht so einfach einzurichten.

Der große Vorteil von Remoting oder WCF besteht darin, dass Sie Objekte zwischen Server und Client übergeben und auf jeder Seite Methoden aufrufen können.

Angenommen, Sie haben eine Abstraktion für Ihre Kamera geschrieben wie:

%Vor%

Dann können Sie ein Remote-Objekt auf dem Server erstellen und etwas schreiben wie:

%Vor%

ruft die Methode GetFrame () auf dem Client auf und übergibt das Bild über das (Inter-) Netz, wenn das Bild serialisierbar ist. Sie müssen nur daran denken, welche Objekte auf der anderen Seite einen Proxy erstellen und welche Objekte auf die andere Seite kopiert werden.

Das ist wirklich kraftvoll und woks für uns wie ein Zauber. Also befreie deinen Verstand von Sockeln:)

    
thalm 24.07.2010, 17:02
quelle
2

Ich habe gerade genau dasselbe gemacht. Ich habe einen TCP-basierten Server geschrieben, der in einer Stunde problemlos 1.000 Clientverbindungen gleichzeitig verarbeiten kann und in 80 Codezeilen mündet. Ich habe tagelang versucht und versäumt, einen Duplex-WCF-Server zu erhalten, der dasselbe macht. Es dauerte 175 Zeilen Code, um einen Duplex-WCF-Server und -Client zu erhalten, und es stürzte ab, wenn 30 Clients gleichzeitig versuchen, eine Verbindung herzustellen.

Also muss ich den anderen Antworten hier widersprechen: Ich habe WCF als eine absolute Katastrophe und rohe Sockets als viel einfacher und zuverlässiger empfunden.

    
Jon Harrop 09.10.2011 23:02
quelle
1

Ich stimme zu Sockets sind sehr niedrig - aber aus Ihrer Problembeschreibung sieht es so aus, als ob der Server die Kommunikation mit den Clients zusätzlich zum üblichen Client einleiten soll - & gt; Serverkommunikation (d. h. Client initiiert). Ich bin auch neu in WCF und ich weiß WCF unterstützt Duplex-Kommunikation. Aber mein GUESS ist, dass, wenn ein Client eine Anfrage stellt, auch eine Callback-Funktion weitergeleitet wird, auf die der Server zugreifen kann. Also das Modell ist immer noch Client - & gt; Server gefolgt von Server, der den Rückruf aufruft.

Die vom Server initiierte Kommunikation mit WCF ist etwas, das ich nicht kenne . Sie sollten dies also überprüfen, bevor Sie sich für eines der beiden entscheiden.
Sie könnten auch eine Kombination von beiden, wie in, WCF für die meisten Szenarien und eine separate Thread-Handhabung Socket-Kommunikation für die Fälle, in denen WCF nicht geeignet / möglich ist.

Danke VM

    
Vikas 24.07.2010 19:41
quelle
0

Sie können WCF verwenden. Sie können Callbacks zum Client durchführen. Beginnen Sie hier: Ссылка

Und ich stimme auch einer anderen Antwort zu: Es ist viel produktiver, einige Tage auf WCF-Evaluierung zu verbringen, anstatt in Sockets zu gehen. In Zukunft müssen Sie viele Funktionen in Socket fehlen .. so müssen Sie sie selbst implementieren. Während WCF sie out-of-the-box bereitstellen.

    
Budda 25.07.2010 00:06
quelle

Tags und Links