Frage

Ich suche eine Cocoa-Anwendung auf dem Aufbau auf dem Mac mit einem Back-End-Daemon-Prozess (wirklich nur eine meist-Maden Cocoa-Anwendung, wahrscheinlich), zusammen mit 0 oder mehr „Client“ Anwendungen lokal ausgeführt wird (obwohl, wenn möglich, ich mag Remote-Clients als auch unterstützen;. die Remote-Clients immer nur sein würden, mit anderen Macs oder iPhone OS-Geräten)

Die Daten übermittelt werden wird ziemlich trivial sein, meist nur Text und Befehle (was ich denke, kann als Text sowieso dargestellt werden), und vielleicht die gelegentliche kleine Datei (ein Bild möglicherweise).

Ich habe dies zu tun ein paar Methoden gesucht, aber ich bin sicher, nicht das ist, „beste“ für die Aufgabe. Dinge, die ich habe angesehen:

  • Lesen und Schreiben in eine Datei (... ja), sehr einfach, aber nicht sehr skalierbar.
  • Reine Buchsen (Ich habe keine Erfahrung mit Steckdosen, aber ich scheinen zu denken, ich sie Daten senden lokal und über ein Netzwerk nutzen können. Obwohl es beschwerlich scheint, wenn alles in Cocoa zu tun
  • Verteilte Objekte: scheint eher unelegant für eine Aufgabe wie diese
  • NSConnection: Ich kann wirklich nicht herausfinden, was diese Klasse auch tut, aber ich habe in einigen IPC-Suchergebnissen davon lesen

Ich bin sicher, es gibt Dinge, die ich bin fehlt, aber ich war überrascht, dass ein Mangel an Ressourcen zu diesem Thema zu finden.

War es hilfreich?

Lösung

Ich bin derzeit auf der Suche in die gleichen Fragen. Für mich ist die Möglichkeit der Zugabe von Windows-Clients macht später die Situation komplizierter; in Ihrem Fall scheint die Antwort einfacher zu sein.

Über die Optionen, die Sie betrachtet haben:

  1. Steuerdateien: Während es möglich ist, über Steuerdateien zu kommunizieren, müssen Sie beachten, dass die Dateien über ein Netzwerk-Dateisystem unter den beteiligten Maschinen mitgeteilt werden müssen. So ist das Netzwerk-Dateisystem als eine Abstraktion der eigentlichen Netzwerk-Infrastruktur dient, bietet aber nicht die volle Leistung und Flexibilität das Netzwerk normalerweise hat. Implementierung: Praktisch, müssen Sie mindestens zwei Dateien für jedes Paar von Client / Server haben: eine Datei der Server-Anwendungen eine Anforderung an den Client (s) und eine Datei für die Antworten zu senden. Wenn jeder Prozess in beiden Richtungen kommunizieren kann, müssen Sie dies duplizieren. Außerdem ist sowohl die Client (s) und die Server (n) Arbeit an einer „Pull“ Basis, das heißt, sie müssen die Kontrolldateien häufig und sehen Sie zu überdenken, wenn etwas Neues geliefert wurde.

    Der Vorteil dieser Lösung besteht darin, dass es die Notwendigkeit für das Erlernen neuer Techniken minimiert. Der große Nachteil ist, dass es große Anforderungen an die Programmlogik hat; müssen eine Menge Dinge, die von Ihnen betreut werden (die Dateien in einem Stück geschrieben werden oder kann es passieren, dass jede Partei, picks up inkonsistenten Dateien? Wie häufig Kontrollen durchgeführt werden sollte? Muss ich Sorge über das Dateisystem, wie Caching, etc? Kann ich Add-Verschlüsselung später ohne Dinge außerhalb meines Programmcode Herumspielen? ...)

    Wenn Portabilität war ein Problem (die, soweit ich aus Ihrer Frage verstand nicht der Fall ist), dann diese Lösung wäre einfach Portierung auf verschiedene Systeme und sogar verschiedene Programmiersprachen. Aber ich weiß nicht, von jedem Netzwerk-Dateien für das iPhone OS ystem, aber ich bin nicht vertraut mit diesem.

  2. Sockel: Die Programmierschnittstelle ist sicherlich anders; je nach Ihrer Erfahrung mit Socket-Programmierung kann es bedeuten, dass Sie es zunächst mehr Arbeit haben zu lernen und es später debuggen. Implementierung : Praktisch, müssen Sie eine ähnliche Logik wie zuvor, das heißt, Client (s) und Server (n) über das Netzwerk kommunizieren. Ein großes Plus dieses Ansatzes besteht darin, dass die Prozesse auf einer „Push“ Basis arbeiten können, das heißt, sie können auf einem Socket hören, bis eine Nachricht eintrifft, die Steuerdateien überprüfen regelmäßig überlegen ist. Netzwerk Korruption und Inkonsistenzen sind auch nicht Ihre Sorge. Außerdem Sie (Mai) über den Weg, um mehr Kontrolle haben die Verbindungen eher etabliert sind als die sich auf Dinge außerhalb der Kontrolle Ihres Programms (auch dies ist wichtig, wenn Sie Verschlüsselung hinzufügen entscheiden später).

    Der Vorteil besteht darin, dass eine Menge Dinge, von den Schultern genommen werden, die eine Implementierung in 1. Der Nachteil stören würde, ist, dass Sie immer noch Ihre Programmlogik im Wesentlichen um ändern müssen, um sicherzustellen, dass Sie senden und empfangen die richtigen Informationen (Dateitypen usw.).

    Nach meiner Erfahrung Portabilität (das heißt, Leichtigkeit auf verschiedene Systeme des Übergangs und sogar Programmiersprachen) ist sehr gut, da alles, was auch nur entfernt kompatibel zu POSIX funktioniert.

    [ EDIT: Insbesondere sobald Sie Binärzahlen Endianess kommunizieren ein Problem wird, und Sie müssen sie dieses Problem manuell nehmen - das ist ein gemeinsamer Sonderfall der "(!) korrekte Informationen“-Ausgabe erwähnte ich oben. Es wird Sie beißen z.B. wenn Sie einen PowerPC auf Intel-Mac zu sprechen. Dieser Sonderfall verschwindet mit der Lösung 3. + 4. alle anderen "richtigen Informationen" Fragen zusammen wird.]

  3. 4. Verteilte Objekte: Die NSProxy Klasse Cluster wird verwendet, verteilte Objekte zu implementieren. NSConnection ist verantwortlich für die für das Senden von Remote-Verbindungen als Voraussetzung der Einrichtung inFormation um, so, wenn Sie verstehen, wie dieses System zu verwenden, verstehen Sie auch verteilte Objekte. ; ^)

    Die Idee ist, dass Ihre High-Level-Programmlogik nicht geändert werden muss (dh Ihre Objekte über Nachrichten kommunizieren und die Ergebnisse empfangen und die Nachrichten zusammen mit den Rückgabetypen sind identisch zu dem, was Sie von Ihrer lokalen Implementierung verwendet werden ), ohne über die Einzelheiten der Netzinfrastruktur zu stören. Nun, zumindest in der Theorie. Implementierung: Ich bin auch jetzt daran arbeiten, so mein Verständnis noch begrenzt ist. Soweit ich verstehe, was Sie tun müssen, um Setup eine bestimmte Struktur, das heißt, müssen Sie noch, welche Prozesse (lokal und / oder remote) entscheiden, welche Nachrichten empfangen kann; das ist, was NSConnection tut. An dieser Stelle Sie implizit eine Client / Server-Architektur definieren, aber Sie nicht Sorge um die genannten Probleme in 2 benötigen.

    Es gibt eine Einführung mit zwei expliziten Beispielen am Gnustep Projektserver; es zeigt, wie die Technologie funktioniert und ist ein guter Punkt für das Experimentieren beginnen: http://www.gnustep.org/resources/documentation/ Entwickler / Basis / ProgrammingManual / manual_7.html

    Leider sind die Nachteile ein Totalverlust der Kompatibilität (obwohl man immer noch gut mit dem Setup tut, werden Sie von Mac und iPhone / iPad nur erwähnt) mit anderen Systemen und den Verlust der Portabilität auf andere Sprachen. Gnustep mit Objective-C ist am besten Code-kompatibel, aber es gibt keine Möglichkeit, kommunizieren zwischen Gnustep und Kakao, sehen meine bearbeiten 2 zu Frage Nummer hier: CORBA auf Mac OS x (Cocoa)

    [ EDIT: Ich habe gerade ein anderes Stück Information, dass ich nicht bewusst war. Während ich überprüft haben, dass NSProxy auf dem iPhone verfügbar ist, hat prüfe ich nicht, ob die anderen Teile des verteilten Objekten Mechanismus sind. Nach diesem Link: http://www.cocoabuilder.com/archive/cocoa/224358-big-picture-relationships-between-nsconnection-nsinputstream-nsoutputstream-etc.html (die Seite für den Begriff "iPhone OS" suchen) Sie sind nicht. Dies würde diese Lösung ausschließen, wenn Sie fordern, iPhone / iPad in diesem Moment zu verwenden.]

So zu schließen, gibt es einen Kompromiss zwischen Aufwand des Lernens (und der Implementierung und Debugging) neue Technologien auf der einen Seite und Hand-Codierung untergeordnete Kommunikationslogik auf dem anderen Seite. Während das verteilte Objekt Ansatz der meisten Last von den Schultern und verursacht nimmt die kleinsten Veränderungen in der Programmlogik ist es am schwierigsten zu lernen und auch (leider) die am wenigsten tragbar.

Andere Tipps

Disclaimer: verteilte Objekte nicht verfügbar auf dem iPhone .


Warum finden Sie verteilte Objekte unelegant? Sie klingt wie ein gutes Spiel hier:

  • transparent Rangierung von Grundtypen und Objective-C-Klassen
  • es ist eigentlich egal, ob Kunden sind lokal oder remote
  • nicht viel zusätzliche Arbeit für Cocoa-basierte Anwendungen

Die Dokumentation könnte es wie mehr Arbeit klingt dann tatsächlich es ist, aber alles, was Sie im Grunde tun müssen, ist, Protokolle zu verwenden, sauber und Export bzw. eine Verbindung zu, die Server Root-Objekt.
Der Rest soll automatisch hinter den Kulissen für Sie im gegebenen Szenario passieren.

Wir verwenden ThoMoNetworking und es funktioniert gut und ist schnell zu installieren. Grundsätzlich ermöglicht es Ihnen, NSCoding konforme Objekte im lokalen Netzwerk, aber natürlich senden funktioniert auch, wenn Client und Server auf dieselbe Maschine er ist. Als Wrapper um die Basisklassen nimmt sie kümmert sich der Paarung, reconnections, etc ..

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top