2015-02-22 17 views
5

TL; DR: NSStream.getStreamsToHostWithName(...) arandığında uzak akışımın doğru şekilde açılıp açılmadığını kontrol etmenin yolu nedir?Uzak soketim NSStream'inin doğru şekilde açık olup olmadığını sınama

Uygulamam, mobil bir IOS8 hızlı uygulamasıdır.

Uzak sunucuyla giriş ve çıkış soketi iletişimi için NSStream kullanıyorum.

benim sunucusuna bağlanmak ve bu kodu kullanabilirsiniz benim akışı açmak için:

func connect(host: String, port: Int) -> Bool 
{ 
    //clear the previous connection if existing (and update self.connected) 
    disconnect() 
    //updating the current connection 
    self.host = host 
    self.port = port 

    //pairing NSstreams with remote connection 
    NSStream.getStreamsToHostWithName(self.host!, port: self.port!, inputStream: &inputStream, outputStream: &outputStream) 

    if (self.inputStream != nil && self.outputStream != nil) 
    { 
     //open streams 
     self.inputStream?.open() 
     self.outputStream?.open() 
    } 
    if self.outputStream?.streamError == nil && self.inputStream?.streamError == nil 
    { 
     println("SOK") //PROBLEM 1 
    } 
    //error checking after opening streams // PROBLEM 2 
    if var inputStreamErr: CFError = CFReadStreamCopyError(self.inputStream)? 
    { 
     println("InputStream error : " + CFErrorCopyDescription(inputStreamErr)) 
    } 
    else if var outputStreamErr: CFError = CFWriteStreamCopyError(self.outputStream)? 
    { 
     println("OutStream error : " + CFErrorCopyDescription(outputStreamErr)) 
    } 
    else 
    { 
     //set the delegate to self 
     self.inputStream?.delegate = self 
     self.outputStream?.delegate = self 
     self.connected = true 
    } 
    //return connection state 
    return self.connected 
} 

Benim sorunum // PROBLEM1 ve // ​​problemi 2 yer almaktadır.

Bu noktalarda, yuvalarımın doğru şekilde açılıp açılmadığını belirlemeye çalışırım, ancak sunucu çalışmıyorsa bile bu kod hala çalışıyorsa, okuma ve yazma işlemleri başarısız oluyor. Bağlantı başarısız olup olmadığını belirlemek istiyorum.

Belki de tamamen yanlış yapıyorum, bunu nasıl test edemiyorum.

inputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode) 
outputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode) 

Ve kodunuzda, bu hatayı kontrol etmek Çok erken: Herşeyden

cevap

27

İlk olarak, schedule the stream on a runloop gerekiyor. open(), uyumsuz olduğundan, sonucu delegate kullanarak beklemeniz gerekir. İşte örnek çalışıyor:

import Foundation 

class Connection: NSObject, NSStreamDelegate { 
var host:String? 
var port:Int? 
var inputStream: NSInputStream? 
var outputStream: NSOutputStream? 

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

    self.host = host 
    self.port = port 

    NSStream.getStreamsToHostWithName(host, port: port, inputStream: &inputStream, outputStream: &outputStream) 

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

     // Set delegate 
     inputStream!.delegate = self 
     outputStream!.delegate = self 

     // Schedule 
     inputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode) 
     outputStream!.scheduleInRunLoop(.mainRunLoop(), forMode: NSDefaultRunLoopMode) 

     print("Start open()") 

     // Open! 
     inputStream!.open() 
     outputStream!.open() 
    } 
} 

func stream(aStream: NSStream, handleEvent eventCode: NSStreamEvent) { 
    if aStream === inputStream { 
     switch eventCode { 
     case NSStreamEvent.ErrorOccurred: 
      print("input: ErrorOccurred: \(aStream.streamError?.description)") 
     case NSStreamEvent.OpenCompleted: 
      print("input: OpenCompleted") 
     case NSStreamEvent.HasBytesAvailable: 
      print("input: HasBytesAvailable") 

      // Here you can `read()` from `inputStream` 

     default: 
      break 
     } 
    } 
    else if aStream === outputStream { 
     switch eventCode { 
     case NSStreamEvent.ErrorOccurred: 
      print("output: ErrorOccurred: \(aStream.streamError?.description)") 
     case NSStreamEvent.OpenCompleted: 
      print("output: OpenCompleted") 
     case NSStreamEvent.HasSpaceAvailable: 
      print("output: HasSpaceAvailable") 

      // Here you can write() to `outputStream` 

     default: 
      break 
     } 
    } 
} 

} 

Ardından: Bu hassas yanıt için

let conn = Connection() 
conn.connect("www.example.com", port: 80) 
+0

teşekkür ederiz. Sadece bazı sorularım var. Öncelikle, zamanlama bölümünü yapmak akışlarımı uyumsuzlaştırıyor mu? Operasyonumun senkronize olmasını istiyorum. –

+0

Anlayışımla, akışın kendisi her zaman engellenmiyor. Senkronize çalışmanız gerekiyorsa, 'true (...}') döngüsüyle '' polling '' kullanmanız gerekir. bakın: https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Streams/Articles/PollingVersusRunloop.html – rintaro

+1

Akış engelleniyor, NSInputStream.read() işlemi varsayılan olarak engelleniyor –

İlgili konular