2016-09-16 72 views
0

我在Swift 3中编写了一个非常简单的基于套接字的命令行工具,但是我的流并没有调用委托方法。例如,当我检查字节是否可用时,有可用的字节,但委托方法尚未被调用。这里是我的连接代码:Swift 3 Socket问题

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

你可以尝试用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") 
    } 

} 

不能保证代码优化。 我还没有明白withUnsafeBytes和UnsafePointer的用法,但设法使它的工作,如果有人有更好的解决方案,请发布。

+0

这确实有帮助。谢谢! – elmarko