相关疑难解决方法(0)

使用 NWConnection 进行长时间运行的 TCP 套接字的正确方法

我整天都在与 NWConnection 作斗争,以在长时间运行的 TCP 套接字上接收数据。由于缺乏文档,我在给自己造成以下错误后终于让它工作了:

  1. 数据不完整(由于只调用一次receive)
  2. 获取 TCP 数据无序(由于从计时器“轮询”接收......导致多个同时关闭等待获取数据)。
  3. 遭受无限循环(由于在接收后重新启动接收而不检查“isComplete”布尔 - 一旦套接字从另一端终止,这是......糟糕......非常糟糕)。

我所学到的总结:

  1. 一旦您处于 .ready 状态,您就可以调用 receive...一次且仅一次
  2. 一旦收到一些数据,您可以再次调用 receive...但前提是您仍处于 .ready 状态并且 isComplete 为 false。

这是我的代码。我认为这是对的。但如果错了请告诉我:

    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: …
Run Code Online (Sandbox Code Playgroud)

networking swift

10
推荐指数
1
解决办法
7272
查看次数

标签 统计

networking ×1

swift ×1