Frage

Ich baue eine Objective-C-Anwendung, die sowohl einen Server und einen Client hat. Der Client kann Aktualisierungen an den Server senden, und der Server muss in der Lage Updates zu jedem angeschlossenen Client zu senden. Ich habe darüber nachgedacht, wie man am besten, dieses System zu implementieren, sondern auch für Ihre Anregungen bin zu fragen.

Zur Zeit denke ich, dass, wenn neue Updates verfügbar sind, wird der Server-Threads verwenden das Update auf jedem Client wiederum zu senden. Wenn ein Client abläuft, sind sie getrennt. Ich habe sehr wenig Networking-Erfahrung, so bin gefragt Ihre Einsicht.

Denken Sie, dass dieses System gut funktionieren würde? Wenn ja, haben Sie irgendwelche Vorschläge, wie das Einfädeln zu tun? Irgendwelche NS-Klassen können Sie mir zeigen auf? Es muss eine Art Schlange sein, die ich verwenden kann, denke ich.

Jede andere Gedanken?

EDIT: Ich erwarte nicht, die Client-Anzahl weit über 50 oder so zu bekommen, bei der max

.
War es hilfreich?

Lösung

Solange sowohl Client als auch Server-OS X-Anwendungen und können sowohl in Objective-C geschrieben werden, um die Cocoa-Frameworks, würde ich empfehlen Ihnen einen Blick auf die verteilte Objekte (DO) -Technologie in Cocoa. Ich werde nicht versuchen, ein Tutorial in verteilten Objekten hier zu geben, nur erklären, warum es sinnvoll sein könnte ...

DO behandelt asynchrone Netzwerk Details für Sie (alle Client-Updates auf einem einzigen Thread passieren könnte). Zusätzlich die Semantik der Kommunikation mit einem entfernten Objekt (Client zum Server oder umgekehrt; DO ist bidirektional, sobald die Verbindung hergestellt ist) sind sehr ähnlich in-Prozess-Kommunikation. Mit anderen Worten, wenn Sie einen Verweis auf das entfernte Objekt haben (wirklich ein NSDistantObject, die am anderen Ende der Verbindung als Proxy für das Objekt fungiert), Ihre Kundennummer kann Nachrichten an das Remote-Objekt senden, als ob es vor Ort war:

[remoteServer update:client];

vom Client oder

[[remoteClientList objectAtIndex:i] update:server];

vom Server. Ich werde die Details der Einrichtung der Verbindung verlassen und für das Erhalten der Entfernter_Server oder Remoteclient Bezug auf Sie nach dem verteilte Objekte Programmieranleitung .

Der Nachteil DO ist, dass Sie nach Cocoa gebunden sind; es wird sehr schwierig, einen nicht-Cocoa-Client oder Server, die Distirbuted Objects in Verbindung zu schreiben. Wenn es eine Chance gibt, können Sie nicht-Cocoa-Client oder Server-Implementierungen haben, sollten Sie nicht verwenden. In diesem Fall würde ich etwas einfach mit vielen Cross-Plattform und Sprachunterstützung empfehlen. Ein REST-Stil-API über HTTP ist eine gute Option. Werfen Sie einen Blick auf die Cocoa URL Beladessystem Dokumentation für Informationen darüber, wie HTTP-Anfragen und Antworten zu implementieren. Werfen Sie einen Blick auf Apples CocoaHTTPServer Beispielcode oder ein code.google.com Projekt die gleichnamigen für Informationen einen HTTP-Server in Ihrem Cocoa-Code auf die Umsetzung.

Als allerletzte Option können Sie einen Blick auf die Cocoa nehmen Stream Programming Guide wenn Sie Ihr eigenes Netzwerk-Protokoll implementieren möchten. NSStream die Unterklassen lassen Sie auf einem Netzwerk-Socket hören und zu handhaben asynchron liest / schreibt an / von diesem Sockel. Viele Leute benutzen AsyncSocket für diesen Zweck. Es umschließt die (untere Ebene) CFStream und CFSocket und macht Schreiben Netzwerk-Code etwas einfacher.

Andere Tipps

Wenn der Server-Updates auf den Clients sendet, wäre es wahrscheinlich einfacher sein, nur ein Thread haben behandeln sie alle, und nur Asynchron-Sockets verwenden. Natürlich wäre dies davon ab, wie viele Kunden hatten Sie mit befassen.

Es gibt mehrere Netzwerke Beispiele in der Apple Developer Seite. Ein Ich würde empfehlen, dass Sie überprüfen die Urlcache, die heruntergeladen werden können. Zitiert aus der Dokumentation von Apple für dieses Beispiel:

  

Urlcache ist ein Beispiel iPhone-Anwendung, die wie demonstriert aus dem Web eine Ressource herunterzuladen, sollte sie in das Datenverzeichnis der Anwendung, und verwenden Sie die lokale Kopie der Ressource. Urlcache zeigt auch, wie ein paar Cache-Strategien implementieren:

Eine interessante Option ist das BLIP Protokoll von Jens Alfke . Es ist wie eine abgespeckte Version von BEEP : einem Message Oriented Networking-System. Es bietet im Grunde die Low-Level-Abstraktionen für ein Rohr bidirektionale Nachricht, so dass Sie auf Layering Kommunikationsprotokoll oben drauf konzentrieren können.

Es hat einige würdige Nachfolger wie Marcus Zarra (Autor der Bibel Coredata) und Gus Mueller von Fliegen Fleisch-Software.

Ich weiß nicht, wie Sie planen Sie System zu entwerfen, aber in der Regel ein Server an einen Client keine Verbindung herstellen kann; muss der Client die Kommunikation initiieren. Mit einer niedrigen Grenze von 50 Kunden, können Sie nicht auf einer Web-Server / Client-ähnliche Implementierung suchen werden ...

Das heißt, es gibt grundsätzlich zwei Möglichkeiten, Client-Server-Kommunikation zu handhaben: 1. Der Client fragt den Server in regelmäßigen Abständen Updates zu erhalten 2. Der Kunde hält eine Verbindung offen auf den Server und die der Server antwortet mit einem bekannten (wie in beiden Seiten verstehen) Protokoll.

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