2017-09-23 6 views
0

Je crée un script afin de recevoir des commandes de serveurs. Mon but est de recevoir le message du serveur 1 ... attendez wait .. puis recevez le message du serveur 2 puis exécutez une action. Cela fonctionne réellement en utilisant DispatchQueue et DispatchGroup. Mon code fonctionne si les serveurs sont en cours d'exécution avant le démarrage de cette application.Prise de flux en attente du serveur Swift

import UIKit 
import Dispatch 

let addr = "192.168.0.100" 
let addr2 = "192.168.0.104" 
let port = 12345 //PORT Num 
var buffer = [UInt8](repeating: 0, count: 255) 
var buffer2 = [UInt8](repeating: 0, count: 255) 

var inpVive1 : InputStream? 
var outVive1 : OutputStream? 

var inpVive2 : InputStream? 
var outVive2 : OutputStream? 

let secondsDelay = 0 

class ViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let queue:DispatchQueue = DispatchQueue.global(qos: .userInitiated) 
     let group:DispatchGroup = DispatchGroup() 

     group.enter() 
     queue.async { 
      self.Connection1() 
      group.leave() 
     } 

     group.enter() 
     queue.async { 
      self.Connection2() 
      group.leave() 
     } 


     group.notify(queue: queue, execute: {// do something when all tasks in queue complete}) 
      print("Everything is received!!!!!!!!!!!!") 
     }) 
    } 


    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func Connection1() { 
     print("Listening vive1") 
     Stream.getStreamsToHost(withName: addr, port: port, inputStream: &inpVive1, outputStream: &outVive1) 

     if inpVive1 != nil && outVive1 != nil { 

      let inputStreamVive1 : InputStream = inpVive1! 
      let outputStreamVive1 : OutputStream = outVive1! 

      inputStreamVive1.delegate = self as? StreamDelegate 
      outputStreamVive1.delegate = self as? StreamDelegate 

      inputStreamVive1.schedule(in: .main, forMode: .defaultRunLoopMode) 
      outputStreamVive1.schedule(in: .main, forMode: .defaultRunLoopMode) 

      inputStreamVive1.open() 
      outputStreamVive1.open() 
      print("Tunnel vive1 ouvert") 

      if outputStreamVive1.streamError == nil && inputStreamVive1.streamError == nil { 

       while true { 
        let readCharsVive1: Int = inputStreamVive1.read(&buffer, maxLength: buffer.count) 
        if (readCharsVive1 > 0) { 
         let readStringVive1: String = NSString(data: NSData(bytes:buffer, length:readCharsVive1) as Data, encoding: String.Encoding.utf8.rawValue)! as String 
         print("Message received vive1 :", readStringVive1) // data from server 
         usleep(300 * 1000) // wait 300 msec (just wait. it is no meaning. using as "NOP") 
         inputStreamVive1.close() 
         outputStreamVive1.close() 

        } 
        else { 
         print ("server1 closed connection") 
         inputStreamVive1.close() 
         outputStreamVive1.close() 
         break 
        } 

       } 

      } 
     } 

    } 

    func Connection2() { 
     print("Listening vive2") 
     Stream.getStreamsToHost(withName: addr2, port: port, inputStream: &inpVive2, outputStream: &outVive2) 

     if inpVive2 != nil && outVive2 != nil { 
      let inputStreamVive2 : InputStream = inpVive2! 
      let outputStreamVive2 : OutputStream = outVive2! 
      inputStreamVive2.open() 
      outputStreamVive2.open() 
      print("Tunnel vive2 ouvert") 

      if outputStreamVive2.streamError == nil && inputStreamVive2.streamError == nil { 
       while true { 
        let readCharsVive2: Int = inputStreamVive2.read(&buffer2, maxLength: buffer2.count) 
        if (readCharsVive2 > 0) { 
         let readStringVive2: String = NSString(data: NSData(bytes:buffer2, length:readCharsVive2) as Data, encoding: String.Encoding.utf8.rawValue)! as String 
         print("Message received vive2 :", readStringVive2) // data from server 
         usleep(300 * 1000) // wait 300 msec (just wait. it is no meaning. using as "NOP") 
         inputStreamVive2.close() 
         outputStreamVive2.close() 

        } 
        else { 
         print ("server2 closed connection") 
         inputStreamVive2.close() 
         outputStreamVive2.close() 
         break 
        } 

       } 
      } 


     } 
    } 



} 

J'ai fait avec succès une connexion au serveur lorsque celui-ci il est déjà en cours d'exécution. Maintenant, j'aimerais pouvoir attendre que ça commence dans le cas où ça ne fonctionne pas. Une idée?

Répondre

-1

En fait, ce problème a résolu mon:

import UIKit 

let addr = "127.0.0.1" 
let port = 12345 //PORT Num 

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

var inputStream : InputStream? 
var outputStream : OutputStream? 
var animationTimer: Timer! 

let readChars: Int = inputStream!.read(&buffer, maxLength: buffer.count) 

class ViewController: UIViewController, StreamDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     Connection() 
    } 

    func Connection() { 

     Stream.getStreamsToHost(withName: addr, port: port, inputStream: &inputStream, outputStream: &outputStream) 

     if inputStream != nil && outputStream != nil { 

       print("connecting") 

       inputStream?.delegate = self 
       outputStream?.delegate = self 

       inputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 
       outputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 

       print("Start open()") 

       inputStream?.open() 
       outputStream?.open() 
     } 
    } 

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

     if aStream === inputStream { 
      switch eventCode { 
      case Stream.Event.errorOccurred: 
       print("input: ErrorOccurred: \(String(describing: aStream.streamError?.localizedDescription))") 
       Connection() 
       break 
      case Stream.Event.openCompleted: 
       print("input: OpenCompleted") 
       break 
      case Stream.Event.hasBytesAvailable: 
       print("input: HasBytesAvailable") 

       print("On est connecté") 

       if readChars > 0 { 
        let readString: String = NSString(data: NSData(bytes:buffer, length:readChars) as Data, encoding: String.Encoding.utf8.rawValue)! as String 
        print(readString) // data from server 
        inputStream?.close() 
        outputStream?.close() 
       } 

      default: 
       break 
      } 
     } 
    } 


} 
+0

résoudre votre problème comment? – EJP

+0

Juste comparer deux scripts – Silvering