2016-07-11 4 views
2

J'essaie d'écrire un exemple sur le service Bonjour et un simple flux d'E/S de socket.Comment vérifier le succès lors de l'écriture avec OutputStream?

Sample

Git URL

Ce que je peux en faire, est:

  1. publier un service et le scanner.
  2. Créez un socket de flux d'E/S entre deux périphériques ou le simulateur. Une fois le socket connecté, j'ai eu un problème avec l'envoi de texte au service

Lorsque le bouton est pressé, rien ne semble se produire, et je me demande s'il écrit ou non.

MISE À JOUR

Il y avait un problème avec le client recevant les informations. Une boucle d'exécution était nécessaire.

func netService(_ sender: NetService, didAcceptConnectionWith inputStream: InputStream, outputStream: NSOutputStream) { 

      self.receiveTextView?.text = "Accept Connection Success" 

      print("netService : \(sender) didAcceptConnectionWith Input Stream : \(inputStream) , Output Stream : \(outputStream)") 
      inputStream.delegate = self 
      outputStream.delegate = self 
      inputStream.schedule(in: RunLoop.main(), forMode: RunLoopMode.defaultRunLoopMode) 
      outputStream.schedule(in: RunLoop.main(), forMode: RunLoopMode.defaultRunLoopMode) 
      inputStream.open() 
      outputStream.open() 
     } 

Les données sont ensuite reçues dans le délégué de flux.

func stream(_ aStream: Stream, handle eventCode: Stream.Event) { 
    case Stream.Event.hasBytesAvailable: 

      NSLog("HasBytesAvailable") 

      var buffer = [UInt8](repeating:0, count:4096) 

      let inputStream = aStream as? InputStream 

      while ((inputStream?.hasBytesAvailable) != false){ 
       let len = inputStream?.read(&buffer, maxLength: buffer.count) 
       if(len > 0){ 
        let output = NSString(bytes: &buffer, length: buffer.count, encoding: String.Encoding.utf8.rawValue) 
        if (output != ""){ 
         NSLog("Server Received : %@", output!) 
         self.receiveTextView?.text = output as String? 
        } 
       }else{ 
        break 
       } 
      } 
      break 
    default: 
      NSLog("unknown.") 
    } 

}

Répondre

2

En supposant que vous savez que la méthode sendMessage(_:) est appelé et se tout ce que vous cherchez à faire est de vérifier si oui ou non l'écriture a réussi, cela peut être fait dans une voie à suivre directement par en regardant la valeur de retour de la méthode d'écriture (documentation) Voici un exemple rapide.

@IBAction func sendMessage(sender: AnyObject!) { 
    guard let outputStream = outputStream else { 
     print("Connection not create yet ! =====> Return") 
     return 
    } 

    guard let text = textfield?.text, 
     data: NSData = text.data(using: String.Encoding.utf8) else { 
      print("no data") 
      return 
    } 

    print("\(outputStream) ==> Pass Data : \(text)") 
    outputStream.open() 
    defer { 
     outputStream.close() 
    } 

    let result = outputStream.write(UnsafePointer<UInt8>(data.bytes), maxLength: data.length) 
    if result == 0 { 
     print("Stream at capacity") 
    } else if result == -1 { 
     print("Operation failed: \(outputStream.streamError)") 
    } else { 
     print("The number of bytes written is \(result)") 
    } 
} 
+0

Merci, je vais essayer votre exemple de code maintenant, et répondre le résultat ici. –

+0

J'ai eu le journal comme ceci Il semble que le problème est le destinataire pas l'expéditeur. <__ NSCFOutputStream: 0x1266c5dc0> ==> Données de passe: Test Le nombre d'octets écrits est 4 , Il semble que le succès, mais le service ne se passe rien. –

+0

Votre réponse peut envoyer le succès à une première action, mais en second lieu il échouera toujours, je dois marquer le code "outputStream.close()", que ce sera le succès à chaque fois, pourquoi ??? –