Question

Je cherche à construire une application Cocoa sur Mac avec un démon back-end (vraiment juste une application Cocoa pour la plupart sans tête, sans doute), avec 0 ou plus « client » d'applications exécutées localement (mais si possible Je voudrais aider les clients à distance aussi bien;. les clients distants ne feraient que jamais d'autres Mac ou appareils iPhone OS)

Les données communiquées sera assez trivial, la plupart du temps juste texte et des commandes (que je suppose que peut être représenté sous forme de texte de toute façon), et peut-être le petit fichier de temps en temps (une image peut-être).

J'ai regardé quelques méthodes pour faire cela, mais je ne suis pas sûr qui est « meilleur » pour la tâche à accomplir. Ce que j'ai pris en compte:

  • Lecture et écriture dans un fichier (... oui), très basique, mais pas très évolutive.
  • prises pures (je n'ai pas d'expérience avec des prises mais je semblent penser que je peux les utiliser pour envoyer des données au niveau local et sur un réseau. Bien qu'il semble compliqué si tout faire à Cocoa
  • Objets distribués: semble plutôt inélégante pour une telle tâche
  • NSConnection: Je ne peux pas vraiment comprendre ce que cette classe ne même, mais je l'ai lu dans certains résultats de recherche IPC

Je suis sûr qu'il ya des choses que je me manque, mais je fus surpris de trouver un manque de ressources sur ce sujet.

Était-ce utile?

La solution

Je cherche actuellement les mêmes questions. Pour moi, la possibilité d'ajouter des clients Windows rend plus tard la situation plus compliquée; dans votre cas, la réponse semble être plus simple.

A propos des options que vous avez pris en compte:

  1. Fichiers de contrôle: Bien qu'il soit possible de communiquer via les fichiers de contrôle, vous devez garder à l'esprit que les fichiers doivent être communiqués par l'intermédiaire d'un système de fichiers réseau entre les machines concernées. Ainsi, le système de fichiers réseau sert d'abstraction de l'infrastructure réseau réel, mais ne propose pas la puissance et la flexibilité du réseau a normalement. Mise en œuvre: Pratiquement, vous aurez besoin d'avoir au moins deux fichiers pour chaque paire de clients / serveurs: un fichier utilisé par le serveur pour envoyer une demande au client (s) et un fichier pour les réponses. Si chaque processus peut communiquer dans les deux sens, vous devez dupliquer ce. En outre, le client (s) et le serveur (s) de travail, à savoir, ils ont besoin de revenir sur les fichiers de contrôle fréquemment sur une base « pull » et voir si quelque chose de nouveau a été livré.

    L'avantage de cette solution est qu'il minimise la nécessité d'apprendre de nouvelles techniques. Le gros inconvénient est qu'il a d'énormes exigences sur la logique du programme; beaucoup de choses doivent être prises en charge par vous (Est-ce que les fichiers sont écrits dans une seule pièce ou peut-il arriver que les choix du parti vers le haut des fichiers incompatibles? Comment doivent souvent les contrôles mis en œuvre? Ai-je besoin de vous soucier du système de fichiers, comme la mise en cache, etc Puis cryptage I ajouter plus tard sans autour des choses jouant en dehors de mon code de programme? ...)

    Si la portabilité est un problème (qui, pour autant que je compris de votre question n'est pas le cas), alors cette solution serait facile au port de différents systèmes et langages de programmation, même différents. Cependant, je ne connais pas de fichiers réseau ystème pour iPhone OS, mais je ne suis pas au courant.

  2. Prises: L'interface de programmation est certainement différente; en fonction de votre expérience avec la programmation de la prise, cela peut signifier que vous avez plus de travail d'apprentissage en premier et le débogage plus tard. Mise en œuvre : Pratiquement, vous aurez besoin d'une logique similaire comme avant, à savoir, le client (s) et serveur (s) de communication via le réseau. Un avantage certain de cette approche est que les processus peuvent travailler sur une « poussée » base, à savoir, ils peuvent écouter sur un socket jusqu'à ce qu'un message arrive qui est supérieur à la vérification des fichiers de contrôle régulièrement. la corruption réseau et les incohérences sont pas non plus votre préoccupation. De plus, vous (peut) plus de contrôle sur la façon dont les connexions sont établies plutôt que de compter sur des choses hors du contrôle de votre programme (encore une fois, ce qui est important si vous décidez d'ajouter un cryptage plus tard).

    L'avantage est que beaucoup de choses sont prises sur vos épaules qui la peine d'une mise en œuvre 1. L'inconvénient est que vous avez encore besoin de changer votre logique de programme essentiellement afin de vous assurer que vous envoyez et recevez les informations correctes (types de fichiers, etc.).

    Dans ma portabilité de l'expérience (par exemple, la facilité de la transition vers des systèmes différents et même les langages de programmation) est très bon car tout, même à distance compatible fonctionne Posix.

    [ EDIT: En particulier, dès que vous communiquez des nombres binaires endianess devient un problème et vous devez prendre soin de ce problème manuellement - c'est un commun cas particulier de la "(!) information correcte » problème je l'ai mentionné ci-dessus. Il vous mordre par exemple lorsque vous avez un PowerPC parler à un Mac Intel. Ce cas particulier disparaît avec la solution 3. + 4. ensemble que toutes les autres questions "information correcte".]

  3. 4. Les objets distribués: Le cluster de classe NSProxy est utilisé pour mettre en œuvre des objets distribués. NSConnection est responsable de la mise en place de connexions à distance comme condition préalable à l'envoi deformation autour, donc une fois que vous comprenez comment utiliser ce système, vous comprenez également des objets distribués. ; ^)

    L'idée est que la logique de votre programme de haut niveau n'a pas besoin d'être modifié (vos objets communiquent via des messages et recevoir les résultats et les messages ainsi que les types de retour sont identiques à ce que vous êtes habitué à partir de votre mise en œuvre locale ) sans avoir à se soucier des détails de l'infrastructure réseau. Eh bien, au moins en théorie. Mise en œuvre: Je travaille aussi sur ce moment, donc ma compréhension est encore limitée. Pour autant que je comprends, vous avez besoin d'installer une certaine structure, à savoir, il faut encore décider quels processus (local et / ou à distance) peut recevoir des messages qui; c'est ce que NSConnection fait. À ce stade, vous définissez implicitement une architecture client / serveur, mais vous n'avez pas besoin de vous soucier des problèmes mentionnés dans 2.

    Il y a une introduction avec deux exemples explicites au niveau du serveur de projet GNUstep; il illustre la façon dont la technologie fonctionne et est un bon point de départ pour l'expérimentation: http://www.gnustep.org/resources/documentation/ développeur / base / ProgrammingManual / manual_7.html

    Malheureusement, les inconvénients sont une perte totale de la compatibilité (bien que vous encore faire très bien avec la configuration que vous avez mentionné des Mac et iPhone / iPad uniquement) avec d'autres systèmes et la perte de la portabilité vers d'autres langues. GNUstep avec Objective-C est au mieux compatible avec le code, mais il n'y a aucun moyen de communiquer entre GNUstep et Cocoa, voir mon édition à la question numéro 2 ici: CORBA sous Mac OS X (Cocoa)

    [ EDIT: Je suis tombé sur une autre juste morceau d'information que je ne connaissais pas. Bien que j'ai vérifié que NSProxy est disponible sur l'iPhone, je n'ai pas vérifié si les autres parties du mécanisme d'objets distribués sont. Selon ce lien: http://www.cocoabuilder.com/archive/cocoa/224358-big-picture-relationships-between-nsconnection-nsinputstream-nsoutputstream-etc.html (recherche sur la page pour l'expression "iPhone OS") ils ne sont pas. Cela exclurait cette solution si vous demande d'utiliser ce moment pour iPhone / iPad.]

Pour conclure, il y a un compromis entre l'effort d'apprentissage (et la mise en œuvre et le débogage) de nouvelles technologies sur la main d'une seule et codage manuel logique de communication plus bas niveau de l'autre. Bien que l'approche d'objets distribués prend plus de charge de vos épaules et les plus petits changements encourt dans la logique du programme, il est le plus difficile à apprendre et aussi (malheureusement) le moins portable.

Autres conseils

Disclaimer: Objets distribués sont pas disponible sur iPhone .


Pourquoi trouvez-vous objets distribués inélégant? Ils sonne comme un bon match ici:

  • triage transparent de types fondamentaux et classes Objective-C
  • il ne compte pas vraiment wether clients sont locaux ou à distance
  • pas beaucoup de travail supplémentaire pour les applications à base de cacao

La documentation peut faire sonner comme plus de travail, alors il est en fait, mais tout ce que vous avez essentiellement à faire est d'utiliser des protocoles proprement et à l'exportation, ou connectez respectivement, les serveurs objet racine.
Le reste devrait se automagiquement dans les coulisses pour vous dans le scénario donné.

Nous utilisons ThoMoNetworking et il fonctionne très bien et est rapide à installer. Fondamentalement, il vous permet d'envoyer des objets conformes NSCoding dans le réseau local, mais bien sûr, fonctionne également si le client et le serveur sont sur lui même machine. En tant que wrapper autour des cours de base, il prend soin d'appariement, reconnexions, etc ..

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top