0

我一直在开发 Smart House 应用程序,这些应用程序需要使用 CocoaAsyncSocket 在 iOS 上使用 Swift 进行单播和多播的 UDP 通信。我想使用网络框架而不是 CocoaAsyncSocket。

我制作了以下试验程序,在“224.0.23.0”处使用单播和多播在 3610 端口接收 UDP。

使用这个程序,我在接收多播和单播时遇到问题。该程序可以处理接收组播,但不能处理单播。当我在 init() 中注释掉“receiveMulticast()”时,该程序可以处理接收单播。我需要处理在 3610 端口接收多播和单播。

有什么建议吗?

========================================

import Foundation
import Network

class Controller: ObservableObject {
  @Published var rxContents = String()
  @Published var rxFrom = String()
  
  init() {
    receiveMulticast()
    receiveUnicast()
  }
  
  func receiveUnicast() {
    guard let listener = try? NWListener(using: .udp, on: 3610)
    else { fatalError() }
    listener.newConnectionHandler = { (newConnection) in
      print("connection OK")
      newConnection.start(queue: .main)
      self.receive(on: newConnection)
    }
    listener.stateUpdateHandler = { (newState) in
      print("listener entered state \(String(describing: newState))")
    }
    listener.start(queue: .main)
  }

  func receiveMulticast() {
    guard let multicast = try? NWMulticastGroup(for: [ .hostPort(host: "224.0.23.0", port: 3610) ], disableUnicast: false)
    else { fatalError() }
    let group = NWConnectionGroup(with: multicast, using: .udp)
    group.setReceiveHandler(maximumMessageSize: 16384, rejectOversizedMessages: true) { (message, content, isComplete) in
      print("Received message from \(String(describing: message.remoteEndpoint))")
      if let content = content, let message = String(data: content, encoding: .utf8) {
        print("Received Message: \(message)")
      }
    }
    group.stateUpdateHandler = { (newState) in
      print("Group entered state \(String(describing: newState))")
    }
    group.start(queue: .main)
  }
  
  private func receive(on connection: NWConnection) {
    connection.receiveMessage { (data: Data?, contentContext: NWConnection.ContentContext?, aBool: Bool, error: NWError?) in
      self.rxFrom = String(describing: connection.endpoint)
      print("Received message from \(self.rxFrom))")
      print(data ?? "data is null")
      if let data = data{
        self.rxContents = String(format: "%@", data as CVarArg)
        print("Received Message(unicast): \(self.rxContents)")
      }
      if let error = error {
        print(error)
      } else {
        self.receive(on: connection)
      }
    }
  }
}
4

0 回答 0