Question

Je construis une application Objective-C qui a à la fois un serveur et un client. Le client peut envoyer des mises à jour sur le serveur, et le serveur doit être en mesure d'envoyer des mises à jour à chaque client connecté. J'ai pensé à la meilleure façon de mettre en œuvre ce système, mais je demande à vos suggestions.

À l'heure actuelle, je pense que lorsque de nouvelles mises à jour sont disponibles, le serveur utilisera threads pour envoyer la mise à jour à chaque client à son tour. Si un client arrive à expiration, ils sont déconnectés. J'ai très peu d'expérience de réseautage, donc je demande votre perspicacité.

Pensez-vous que ce système fonctionne bien? Si oui, avez-vous des suggestions sur la façon de faire le filetage? NS toutes les classes que vous pouvez me pointer? Il doit y avoir une sorte de file d'attente que je peux utiliser, je pense.

Toutes les autres pensées?

EDIT: Je ne pense pas le nombre de clients pour obtenir beaucoup plus de 50 ou si, au max

.
Était-ce utile?

La solution

Tant que le client et le serveur sont des applications OS X et peuvent être écrits en Objective-C à l'aide des cadres de cacao, je vous recommande vivement de jeter un oeil à la page Objets distribués (DO) de la technologie dans le cacao. Je ne vais pas essayer de donner un tutoriel en objets distribués ici, juste expliquer pourquoi il pourrait être utile ...

DO gère les détails de réseau asynchrones pour vous (toutes les mises à jour des clients pourraient se produire sur un seul thread). En outre la sémantique de communication avec un objet distant (client vers le serveur ou inversement; DO est bidirectionnel, une fois la connexion établie) sont très similaires à la communication en cours. En d'autres termes, une fois que vous avez une référence à l'objet distant (vraiment un NSDistantObject qui agit comme un proxy à l'objet à l'autre bout de la connexion), votre code client peut envoyer des messages à l'objet distant comme si elle était locale:

[remoteServer update:client];

du client ou

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

à partir du serveur. Je vais laisser les détails de la mise en place de la connexion et pour obtenir le remoteServer ou référence RemoteClient vous après avoir lu le Objets distribués Guide de programmation .

L'inconvénient de l'utilisation DO est que vous êtes lié à Cocoa; il sera très difficile d'écrire un client non-cacao ou d'un serveur qui communique à l'aide d'objets Distirbuted. S'il y a une chance que vous pouvez avoir des implémentations client non Cocoa ou serveur, vous ne devriez pas utiliser DO. Dans ce cas, je recommande quelque chose de simple avec beaucoup de multi-plateforme et prise en charge linguistique. Une API de type REST sur HTTP est une bonne option. Jetez un oeil sur le cacao URL de la documentation du système de chargement pour plus d'informations sur la façon de mettre en œuvre les demandes et les réponses HTTP. Jetez un coup d'oeil au code exemple d'Apple CocoaHTTPServer ou un projet de code.google.com même nom pour plus d'informations sur la mise en œuvre d'un serveur HTTP dans votre code de cacao.

En tant que dernière option, vous pouvez jeter un oeil à Cocoa Guide de programmation Stream si vous souhaitez implémenter votre propre protocole réseau. Les sous-classes de NSStream vous permettra d'écouter sur une prise réseau et gérer asynchrone lit / écrit / de cette prise. Beaucoup de gens utilisent à cette fin AsyncSocket . Il enveloppe le CFStream et CFSocket (niveau inférieur) et rend le code réseau d'écriture un peu plus facile.

Autres conseils

Lorsque le serveur envoie des mises à jour aux clients, il serait probablement plus facile d'avoir un seul fil les manipuler tous, et il suffit d'utiliser les prises async. Bien sûr, cela dépendra du nombre de clients que vous deviez traiter aussi.

Il y a plusieurs exemples de mise en réseau dans le côté développeur Apple. Que je vous recommande de vérifier est le Urlcache, qui peut être téléchargé. Je cite la documentation Apple pour cet exemple:

  

Urlcache est un exemple d'application iPhone qui montre comment télécharger une ressource sur le web, rangez-le dans le répertoire de données de l'application, et utiliser la copie locale de la ressource. Urlcache montre également comment mettre en œuvre un couple de politiques de mise en cache:

Une option intéressante est le protocole BLIP Jens Alfke . Il est comme une version allégée de BEEP: un système de réseau orienté message. Il fournit essentiellement les abstractions de bas niveau pour un tuyau de message bidirectionnel afin que vous puissiez vous concentrer sur la superposition de votre protocole de communication sur le dessus de celui-ci.

Il a quelques adeptes dignes tels que Marcus Zarra (auteur de la Bible CoreData) et Gus Mueller de vol logiciel de viande.

Je ne sais pas comment vous envisagez de concevoir votre système, mais généralement un serveur ne peut pas se connecter à un client; le client doit initier la communication. Avec une faible limite de 50 clients, vous ne regardiez pas à une implémentation serveur web / comme client ...

Cela dit, il existe essentiellement deux façons de gérer la communication client-serveur: 1. Les sondages client périodiquement le serveur pour obtenir des mises à jour 2. Le client conserve une connexion ouverte au serveur et le serveur répond avec un protocole bien connu (comme dans les deux côtés comprendre).

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