2016-12-14 4 views
5

Also spielte ich in Swift mit Sockets herum und versuchte, die App mit meinem Server zu verbinden. Ich ließ die App mit der IP-Adresse des Servers verbinden und verwendete netcat auf dem Server zum Testen. Während der Ausführung zeigte die Konsolenausgabe von der App, dass sie erfolgreich mit dem Server verbunden war. Der Streamdelegate scheint jedoch nicht zu reagieren. Als ich in netcat tippte, druckte die App-Konsole nichts. Ich habe lange gesucht und festgestellt, dass meine Implementierung sehr ähnlich zu anderen ist. Vielleicht vermisse ich hier etwas, das ich nicht sehe.Non-responsive Stream Delegate in Swift

Jeder Gedanke zu diesem Problem würde sehr geschätzt werden!

-Code ist unten angehängt:

import UIKit 

class ViewController: UIViewController, StreamDelegate { 

    let addr:String = "52.34.56.78" 
    let port:Int = 1234 

    var inputStream: InputStream? 
    var outputStream: OutputStream? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.connect(host: addr, port: port) 
    } 

    func connect(host: String, port: Int) { 

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

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

      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() 

      print("successfully connected") 
     } 
     else { 
      print("connection unsuccessful") 
     } 
    } 

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

     if aStream === inputStream { 
      switch eventCode { 
      case Stream.Event.errorOccurred: 
       print("input: ErrorOccurred: \(aStream.streamError?.localizedDescription)") 
       break 
      case Stream.Event.openCompleted: 
       print("input: OpenCompleted") 
       break 
      case Stream.Event.hasBytesAvailable: 
       print("input: HasBytesAvailable") 
       break 
      default: 
       break 
      } 
     } 
     else { 
      print("unknown stuff happened") 
     } 
    } 
} 
+0

So scheint es, als ob die App eine Verbindung zum Server herstellen konnte, aber die Funktion stream() wurde überhaupt nicht ausgelöst. Als ich nach 'inputStream.hasBytesAvailable' gesucht habe, wurde 'TrueStream.hasBytesAvailable' zurückgegeben, nachdem ich etwas über' netcat' gesendet habe. Ich vermute, dass dies etwas damit zu tun hat, den Streamdelegaten oder vielleicht die Laufschleife nicht richtig zu konfigurieren. – cafemike

Antwort

9

So nach viele Versuchen und Irrtümern, erkannte ich, schließlich der Strom() Funktion nicht nur nicht funktioniert, weil die Unterzeichnung dieser Funktion nicht in Ordnung/veraltet. Hier

ist, was ich mit:

func stream(aStream: Stream, handleEvent eventCode: Stream.Event)

Aber eigentlich sollte es sein:

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

Dies ist wahrscheinlich eine Syntax Konvertierung von früheren Swift Version Swift 3. Die Der XCode-Compiler erkennt normalerweise veraltete Funktionen/Syntax, hat diese aber leider nicht gefunden.

Ich hoffe, meine Antwort könnte denen helfen, die immer noch unter diesem Problem leiden.

+0

Ich habe versucht, dieses Problem auch für eine lange Zeit herauszufinden; danke für die Veröffentlichung – humblebeast

+0

Weißt du, wie du spülen würdest, nachdem der Puffer voll ist? – humblebeast

+1

Froh, dass ich helfen kann! Ich schätze, du kannst eine Schleife in deine read() -Funktion einfügen. Wenn also Bytes zum Lesen verfügbar sind, sollte Ihre read() -Funktion funktionieren. Sie können auch eine Puffergrößenbeschränkung festlegen. Wenn also read() fertig ist und _x_ Anzahl von Bytes verarbeitet, können Sie mit dem Parsen fortfahren, ohne auf den Empfang der gesamten Antwort warten zu müssen. – cafemike

Verwandte Themen