📜  发送接收 udp swift (1)

📅  最后修改于: 2023-12-03 14:50:36.589000             🧑  作者: Mango

发送和接收 UDP 数据包

在 Swift 中,可以使用 GCDAsyncUdpSocket 框架来创建 UDP 数据包的收发器。下面是一个简单的示例。

引入框架

首先,需要在项目中引入 CocoaAsyncSocket 框架。可以手动下载并拖拽至工程中,或使用 CocoaPods 进行依赖管理。

pod 'CocoaAsyncSocket'
创建 UDP 接收器
import CocoaAsyncSocket

class ViewController: NSViewController, GCDAsyncUdpSocketDelegate {

    var udpSocket: GCDAsyncUdpSocket!

    override func viewDidLoad() {
        super.viewDidLoad()

        udpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: DispatchQueue.main)

        do {
            try udpSocket.bind(toPort: 8888)
            try udpSocket.beginReceiving()
        } catch {
            print("Error creating UDP receiver: \(error.localizedDescription)")
        }
    }

    // MARK: - GCDAsyncUdpSocketDelegate
    
    func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) {
        let message = String(data: data, encoding: .utf8) ?? "<unknown message>"
        print("[Received] \(message)")
    }
}

上面的代码创建了一个 UDP 接收器,并通过 port=8888 开放了一个监听端口。当 UDP 数据报来到时,就会调用 udpSocket(_:didReceive:fromAddress:withFilterContext:) 方法。

发送 UDP 数据包
class ViewController: NSViewController, GCDAsyncUdpSocketDelegate {

    var udpSocket: GCDAsyncUdpSocket!

    override func viewDidLoad() {
        // ...
    }

    // ...
    
    func sendUDPMessage(message: String, toHost host: String, port: UInt16) {
        let data = message.data(using: .utf8)!
        udpSocket.send(data, toHost: host, port: port, withTimeout: -1, tag: 0)
        print("[Sent] \(message)")
    }
}

上面的代码创建了一个名为 sendUDPMessage 的方法,可以用来发送 UDP 数据包。

示例代码

完成以上配置后,可以运行以下测试代码:

override func viewDidAppear() {
    super.viewDidAppear()

    DispatchQueue.global().asyncAfter(deadline: .now() + 1) {
        self.sendUDPMessage(message: "Hello, world!", toHost: "localhost", port: 8888)
    }
}

在一秒钟后,程序将会向本地(localhost)的 8888 端口发送一条数据报。

参考链接