简体   繁体   English

如何在 iOS 中快速使用 UDP 套接字?

[英]How to work with UDP sockets in iOS, swift?

I'm trying connect to local esp8266 UDP server.我正在尝试连接到本地 esp8266 UDP 服务器。 SwiftSocket haven't documentation. SwiftSocket 没有文档。 CocoaAsyncSocket doesn't work. CocoaAsyncSocket 不起作用。 How to connect and send data to udp server?如何连接和发送数据到udp服务器? What i should do?我该做什么?

I wrote sample UDP python server and tried connect to them via SwiftSocket and CocoaAsyncSocket.我编写了示例 UDP python 服务器并尝试通过 SwiftSocket 和 CocoaAsyncSocket 连接到它们。 I'm don't get feedback from app.我没有得到应用程序的反馈。 Server don't receive connections.服务器不接收连接。 For example- one of the most attempts:例如 - 最多的尝试之一:

    var connection = NWConnection(host: "255.255.255.255", port: 9093, using: .udp)

    connection.stateUpdateHandler = { (newState) in
        switch (newState) {
        case .ready:
            print("ready")
        case .setup:
            print("setup")
        case .cancelled:
            print("cancelled")
        case .preparing:
            print("Preparing")
        default:
            print("waiting or failed")
            break
        }
    }
    connection.start(queue: .global())
    connection.send(content: "Xyu".data(using: String.Encoding.utf8), completion: NWConnection.SendCompletion.contentProcessed(({ (NWError) in
        print(NWError)
    })))
    connection.receiveMessage { (data, context, isComplete, error) in
        print("Got it")
        print(data)
    }

Can't connect to the server无法连接到服务器

This solution work for me!这个解决方案对我有用! Thanks @Paulw11谢谢@Paulw11
Swift 4, XCode 10.1, iOS 12.0 Swift 4、XCode 10.1、iOS 12.0
Simple connect to the public UDP server (This is NOT optimal version but works):简单连接到公共 UDP 服务器(这不是最佳版本但有效):

import UIKit
import Network

class ViewController: UIViewController {

    var connection: NWConnection?
    var hostUDP: NWEndpoint.Host = "iperf.volia.net"
    var portUDP: NWEndpoint.Port = 5201

    override func viewDidLoad() {
        super.viewDidLoad()

        // Hack to wait until everything is set up
        var x = 0
        while(x<1000000000) {
            x+=1
        }
        connectToUDP(hostUDP,portUDP)
    }

    func connectToUDP(_ hostUDP: NWEndpoint.Host, _ portUDP: NWEndpoint.Port) {
        // Transmited message:
        let messageToUDP = "Test message"

        self.connection = NWConnection(host: hostUDP, port: portUDP, using: .udp)

        self.connection?.stateUpdateHandler = { (newState) in
            print("This is stateUpdateHandler:")
            switch (newState) {
                case .ready:
                    print("State: Ready\n")
                    self.sendUDP(messageToUDP)
                    self.receiveUDP()
                case .setup:
                    print("State: Setup\n")
                case .cancelled:
                    print("State: Cancelled\n")
                case .preparing:
                    print("State: Preparing\n")
                default:
                    print("ERROR! State not defined!\n")
            }
        }

        self.connection?.start(queue: .global())
    }

    func sendUDP(_ content: Data) {
        self.connection?.send(content: content, completion: NWConnection.SendCompletion.contentProcessed(({ (NWError) in
            if (NWError == nil) {
                print("Data was sent to UDP")
            } else {
                print("ERROR! Error when data (Type: Data) sending. NWError: \n \(NWError!)")
            }
        })))
    }

    func sendUDP(_ content: String) {
        let contentToSendUDP = content.data(using: String.Encoding.utf8)
        self.connection?.send(content: contentToSendUDP, completion: NWConnection.SendCompletion.contentProcessed(({ (NWError) in
            if (NWError == nil) {
                print("Data was sent to UDP")
            } else {
                print("ERROR! Error when data (Type: Data) sending. NWError: \n \(NWError!)")
            }
        })))
    }

    func receiveUDP() {
        self.connection?.receiveMessage { (data, context, isComplete, error) in
            if (isComplete) {
                print("Receive is complete")
                if (data != nil) {
                    let backToString = String(decoding: data!, as: UTF8.self)
                    print("Received message: \(backToString)")
                } else {
                    print("Data == nil")
                }
            }
        }
    }
}

You need to wait until your connection is in the ready state before you try and send or receive any data.在尝试发送或接收任何数据之前,您需要等到连接处于ready状态。 You will also need to hold a strong reference to your connection in a property to prevent it from being released as soon as the function exits.您还需要在属性中保存对您的连接的强引用,以防止它在函数退出时立即被释放。

var connection: NWConnection?

func someFunc() {

    self.connection = NWConnection(host: "255.255.255.255", port: 9093, using: .udp)

    self.connection?.stateUpdateHandler = { (newState) in
        switch (newState) {
        case .ready:
            print("ready")
            self.send()
            self.receive()
        case .setup:
            print("setup")
        case .cancelled:
            print("cancelled")
        case .preparing:
            print("Preparing")
        default:
            print("waiting or failed")

        }
    }
    self.connection?.start(queue: .global())

}

func send() {
    self.connection?.send(content: "Test message".data(using: String.Encoding.utf8), completion: NWConnection.SendCompletion.contentProcessed(({ (NWError) in
        print(NWError)
    })))
}

func receive() {
    self.connection?.receiveMessage { (data, context, isComplete, error) in
        print("Got it")
        print(data)
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM