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ésoudre votre problème comment? – EJP
Juste comparer deux scripts – Silvering