2017-09-23 122 views
0

我制作一个脚本以接收服务器命令。我的目标是接收来自服务器1的消息...等待,然后从服务器2接收消息,然后执行一个动作。这实际上使用DispatchQueue和DispatchGroup。如果服务器在此应用启动之前运行,我的代码就可以工作。流套接字等待服务器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 
        } 

       } 
      } 


     } 
    } 



} 

当它已经在运行时,我成功地连接了服务器。现在我希望能够等到它没有运行时开始。任何想法?

回答

-1

其实这解决了我的问题:

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

解决您的问题怎么样? – EJP

+0

只需比较两个脚本 – Silvering