Search code examples
swiftsocketsserverstreamserversocket

Stream socket waiting for server Swift


I make a script in order to receive servers commands. My goal is to receive the message from server 1...wait wait.. then receive the message from server 2 then execute an action. This actually work using DispatchQueue and DispatchGroup. My code works if servers are running before this app is started.

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
                    }

                }
            }


        }
    }



}

I successfully made a connection to the server when this one it’s already running. Now I would like to be able to wait until it starts in the case it’s not running . Any idea?


Solution

  • Actually this solved my issue :

    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
                }
            }
       }
    
    
    }