我整天都在与 NWConnection 作斗争,以在长时间运行的 TCP 套接字上接收数据。由于缺乏文档,我在给自己造成以下错误后终于让它工作了:
我所学到的总结:
这是我的代码。我认为这是对的。但如果错了请告诉我:
queue = DispatchQueue(label: "hostname", attributes: .concurrent)
let serverEndpoint = NWEndpoint.Host(hostname)
guard let portEndpoint = NWEndpoint.Port(rawValue: port) else { return nil }
connection = NWConnection(host: serverEndpoint, port: portEndpoint, using: .tcp)
connection.stateUpdateHandler = { [weak self] (newState) in
switch newState {
case .ready:
debugPrint("TcpReader.ready to send")
self?.receive()
case .failed(let error):
debugPrint("TcpReader.client failed with error \(error)")
case .setup:
debugPrint("TcpReader.setup")
case .waiting(_):
debugPrint("TcpReader.waiting")
case .preparing:
debugPrint("TcpReader.preparing")
case .cancelled:
debugPrint("TcpReader.cancelled")
}
}
func receive() {
connection.receive(minimumIncompleteLength: 1, maximumLength: 8192) { (content, context, isComplete, error) in
debugPrint("\(Date()) TcpReader: got a message \(String(describing: content?.count)) bytes")
if let content = content {
self.delegate.gotData(data: content, from: self.hostname, port: self.port)
}
if self.connection.state == .ready && isComplete == false {
self.receive()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为您可以多次使用短时间连接。例如,客户端连接到主机并要求主机执行某些操作,然后告诉主机关闭连接。主机切换到等待模式以准备新连接。参见下图。
归档时间: |
|
查看次数: |
7272 次 |
最近记录: |