2016-12-14 38 views
5

所以我在Swift中使用套接字玩弄,试图将应用程序与我的服务器连接起来。我正在将应用程序连接到服务器的IP地址,并在服务器上使用netcat进行测试。在执行期间,应用程序的控制台输出显示它已成功连接到服务器。但是,流委托似乎没有响应。当我输入netcat时,应用程序控制台未打印任何内容。我搜索了很长时间,发现我的实现与其他实现非常相似。也许我在这里错过了一些我看不到的东西。Swift中无响应的流代理

任何想到这个问题将不胜感激!

代码如下附:

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

所以它似乎应用程序能够连接到服务器,但stream()函数根本没有触发。当我检查'inputStream.hasBytesAvailable'时,它在我通过'netcat'发送了一些东西后返回true。我怀疑这与没有正确配置流代理或运行循环有关。 – cafemike

回答

9

所以经过大量的试验和错误,我终于实现了流()函数没有工作,只是因为这个函数的签名是不正确/过时。

下面是我用的是什么:

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

但实际上它应该是:

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

这可能是从以前的版本雨燕语法转换斯威夫特3。 XCode编译器通常会检测过时的函数/语法,但遗憾的是没有发现这个。

希望我的回答可以帮助那些仍然患有这个问题的人。

+0

我一直试图弄清楚这个问题很长一段时间;感谢张贴 – humblebeast

+0

你知道你将如何刷新后,缓冲区已满? – humblebeast

+1

很高兴我能帮忙!我想你可以在你的read()函数中放一个循环。所以基本上只要有字节可以读取,你的read()函数应该可以工作。您还可以设置缓冲区大小限制,以便只要read()完成处理_x_字节数,就可以继续解析,而无需等待接收整个响应。 – cafemike