2014-05-08 3 views
1

Ma première question est comment puis-je obtenir le rappel didAcceptConnectionWithInputStream:outputStream: dans NSNetServiceDelegate pour se faire appeler?Comment didAcceptConnectionWithInputStream: outputStream: est-il appelé?

Question de suivi: puis-je toujours établir une connexion entre un client et un serveur, bien que je ne reçoive jamais de rappel indiquant qu'une connexion a été acceptée (via didAcceptConnectionWithInputStream:outputStream:)?

Je comprends que l'appel publishWithOptions, en passant dans l'option NSNetServiceListenForConnections est censé entraîner le rappel NetServiceDelegate (didAcceptConnectionWithInputStream:outputStream:) à appeler. Cependant, ce rappel n'est pas appelé.

Voici les étapes que je prends, de publier:

  1. Créer NSNetService avec

    self.netService = [[NSNetService alloc] initWithDomain: @ "" Type : _serviceType nom: (_name == nul)? @ "": _name port: 0];

  2. service de planification dans runloop courant, en mode par défaut

  3. Définissez le délégué à mon objet wrapper Server
  4. d'appel publishWithOptions:NSNetServiceListenForConnections

Voici les mesures que je prends, pour parcourir les services:

  1. Créer un NSNetServiceBrowser et définir son délégué sur mon objet wrapper client
  2. Appel searchForServicesOfType pour le même type de service et domaine comme NSNetService
  3. Liste des services dans un UITableView pour l'interface utilisateur, pour permettre à un utilisateur de sélectionner un service
  4. Lorsqu'un utilisateur sélectionne un service, réglez le délégué du service à mon client objet, et appelez getInputStream:outputSteam: sur le service
  5. Après getInputStream: outputSteam: renvoie le succès, je m'attendrais didAcceptConnectionWithInputStream:outputStream: à être appelé. Cependant cela ne se produit pas.

Merci pour votre aide!

+0

avez-vous compris? – Legolas

Répondre

1

Le problème est que didAcceptConnectionWithInputStream:outputStream: doit être appelé du côté acceptant la connexion.

Une fois que le service est disponible, vous appelez obtenir les flux

[service getInputStream:&istream outputStream:&ostream]

Une fois que cela se produit sur le côté réception de la demande, la méthode déléguée

- (void)netService:(NSNetService *)sender didAcceptConnectionWithInputStream:(NSInputStream *)inputStream outputStream:(NSOutputStream *)outputStream 

seront appelés

+0

Oui, je comprends que 'didAcceptConnectionWithInputStream: outputStream:' doit être appelé du côté acceptant la connexion. Dans mon cas, le serveur agit également comme client, et toujours cette méthode de rappel, 'didAcceptConnectionWithInputStream: outputStream:' n'a jamais été appelée. – Sheamus

0

Tout cela fait partie de l'initialisation paresseuse.L'appel getInputStream:outputStream: vous rendra deux NSStreams parfaitement prêts à l'emploi. Donc, disons, vous voulez écrire des données? Tout d'abord, ouvrez le flux d'écriture ...

BAM! netService:didAcceptConnectionWithInputStream:outputStream: est appelée. Dans mon expérience, ce n'est pas le fait d'appeler getInputStream:outputStream: sur le client qui provoque didAcceptConnectionWithInputStream:outputStream: à être appelé sur le serveur

1

Sur le client, après avoir appelé getInputStream:outputStream:, votre client doit appeler [inputStream open] et [outputStream open] avant la didAcceptConnectionWithInputStream:outputStream: sera appelée.