2016-09-16 12 views
0

Swift 3では非常に単純なソケットベースのコマンドラインツールを作成していますが、私のストリームはデリゲートメソッドを呼び出すことはありません。たとえば、バイトが使用可能かどうかをチェックすると、使用可能なバイトがありますが、デリゲートメソッドが呼び出されていません。ここに私の接続コードは次のとおりです。Swift 3ソケットの問題

func connect() { 

    print("Socket Connection") 

    let ipAddress = "127.0.0.1" as CFString 

    let portNumber: UInt32 = 8080 

    var readStream: Unmanaged<CFReadStream>? 
    var writeStream: Unmanaged<CFWriteStream>? 
    CFStreamCreatePairWithSocketToHost(nil, ipAddress, portNumber, &readStream, &writeStream) 

    self.inputStream = readStream!.takeRetainedValue() 
    self.outputStream = writeStream!.takeRetainedValue() 

    self.inputStream?.delegate = self 
    self.outputStream?.delegate = self 

    self.inputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 
    self.outputStream?.schedule(in: RunLoop.current, forMode: RunLoopMode.defaultRunLoopMode) 

    self.inputStream?.open() 
    self.outputStream?.open() 
} 
+0

currentではなくmainRunLoopで試すことができますか? – Hasya

+0

私はそれを試みたが、それは同じ結果を持っていた。 – wt65074

+0

https://github.com/tidwall/SwiftWebSocketに行って、このラッパークラスを使用することをお勧めします。これは私のプロジェクトで使用しています。それは非常に耐久性があり、堅牢です。 – Hasya

答えて

1

これは

var inputStream:InputStream! 
var outputStream:OutputStream! 
var buffer = [UInt8](repeating: 0, count: 1024) 

func useCFStream() { 

    let host:CFString = "news.yahoo.com" as CFString 
    let port:uint = 80 


    var readStream :Unmanaged<CFReadStream>?; 
    var writeStream:Unmanaged<CFWriteStream>?; 


    CFStreamCreatePairWithSocketToHost(nil, host as CFString, port, &readStream, &writeStream) 

    inputStream    = readStream!.takeRetainedValue() 
    outputStream   = writeStream!.takeRetainedValue() 

    inputStream.delegate = self 
    outputStream.delegate = self 


    inputStream.schedule(in: RunLoop.current, forMode:.defaultRunLoopMode) 
    outputStream.schedule(in:RunLoop.current, forMode:.defaultRunLoopMode) 

    inputStream.open() 
    outputStream.open() 


    let iData      = "GET /rss/entertainment HTTP/1.1 \n\n" 
    var sendData     = iData.data(using: String.Encoding.utf8) 


    let uData = sendData?.withUnsafeBytes({ (buffer:UnsafePointer<UInt8>?) -> UnsafePointer<UInt8> in 

     return buffer!.advanced(by: 0) 
    }) 
    outputStream.write(uData!, maxLength: sendData!.count) 

} 

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

    if stream === inputStream { 

     print("input") 

     switch eventCode { 

     case Stream.Event.openCompleted: 
      //print("input: openCompleted") 
      break 
     case Stream.Event.hasBytesAvailable: 
      print("input: HasBytesAvailable") 


      inputStream.read(&buffer, maxLength: buffer.count) 
      while inputStream.hasBytesAvailable { 
       _ = inputStream.read(&buffer, maxLength: buffer.count) 
       let str = String(bytes: buffer, encoding: String.Encoding.utf8) 
       print(" \(str)") 

      } 

     default: 
      print("default") 
     } 
    } 
    else if stream === outputStream { 

     //print("output") 
    } 

} 

は、コードの最適化を保証することはできませんに役立つかもしれません。 私はUnUsafeBytesとUnsafePointerの使い方を理解していませんが、誰かがより良いソリューションを投稿してくれれば、それを動作させることができました。

+0

これは役に立ちました。ありがとうございました! – elmarko