Swift 中的无响应流委托
Non-responsive stream delegate in Swift
所以我在 Swift 中尝试使用套接字并尝试将应用程序连接到我的服务器。我让应用程序连接到服务器的 IP 地址,并在服务器上使用 netcat
进行测试。在执行期间,应用程序的控制台输出显示它已成功连接到服务器。但是,流委托似乎没有响应。当我输入 netcat
时,应用程序控制台没有打印任何内容。我搜索了很长时间,发现我的实现与其他实现非常相似。也许我在这里遗漏了一些我没有看到的东西。
任何对这个问题的想法将不胜感激!
代码附在下面:
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")
}
}
}
所以在大量的 试验和错误之后,我终于意识到stream() 函数没有工作只是因为这个函数的签名是incorrect/obsolete。
这是我使用的:
func stream(aStream: Stream, handleEvent eventCode: Stream.Event)
但实际上应该是:
func stream(_ aStream: Stream, handle eventCode: Stream.Event)
这可能是从以前的 Swift 版本到 Swift 的语法转换 3. XCode 编译器通常检测过时的 functions/syntax,但很遗憾没有发现这个.
希望我的回答能帮到那些还在为这个问题苦恼的人。
所以我在 Swift 中尝试使用套接字并尝试将应用程序连接到我的服务器。我让应用程序连接到服务器的 IP 地址,并在服务器上使用 netcat
进行测试。在执行期间,应用程序的控制台输出显示它已成功连接到服务器。但是,流委托似乎没有响应。当我输入 netcat
时,应用程序控制台没有打印任何内容。我搜索了很长时间,发现我的实现与其他实现非常相似。也许我在这里遗漏了一些我没有看到的东西。
任何对这个问题的想法将不胜感激!
代码附在下面:
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")
}
}
}
所以在大量的 试验和错误之后,我终于意识到stream() 函数没有工作只是因为这个函数的签名是incorrect/obsolete。
这是我使用的:
func stream(aStream: Stream, handleEvent eventCode: Stream.Event)
但实际上应该是:
func stream(_ aStream: Stream, handle eventCode: Stream.Event)
这可能是从以前的 Swift 版本到 Swift 的语法转换 3. XCode 编译器通常检测过时的 functions/syntax,但很遗憾没有发现这个.
希望我的回答能帮到那些还在为这个问题苦恼的人。