如何在iOS、swift中使用UDP套接字?
我正在尝试连接到本地esp8266 UDP服务器。SwiftSocket没有文档。CocoaAsyncSocket不工作。 如何连接和发送数据到udp服务器?我该怎么办 我编写了示例UDP python服务器并尝试通过SwiftSocket和CoCoCoaAsyncSocket连接到它们。我很抱歉没有收到应用程序的反馈。服务器不接收连接。 例如-最重要的尝试之一:如何在iOS、swift中使用UDP套接字?,ios,swift,sockets,udp,Ios,Swift,Sockets,Udp,我正在尝试连接到本地esp8266 UDP服务器。SwiftSocket没有文档。CocoaAsyncSocket不工作。 如何连接和发送数据到udp服务器?我该怎么办 我编写了示例UDP python服务器并尝试通过SwiftSocket和CoCoCoaAsyncSocket连接到它们。我很抱歉没有收到应用程序的反馈。服务器不接收连接。 例如-最重要的尝试之一: var connection = NWConnection(host: "255.255.255.255", port: 9
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)
}
无法连接到服务器在尝试发送或接收任何数据之前,您需要等待连接处于就绪状态。您还需要在属性中保留对连接的强引用,以防止函数退出后立即释放连接
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)
}
}
这个解决方案对我有用!谢谢@Paulw11
Swift 4、XCode 10.1、iOS 12.0
简单连接到公共UDP服务器(这不是最佳版本,但有效):
导入UIKit
导入网络
类ViewController:UIViewController{
var连接:NWConnection?
var hostUDP:NWEndpoint.Host=“iperf.volia.net”
var portUDP:NWEndpoint.Port=5201
重写func viewDidLoad(){
super.viewDidLoad()
//黑客等待,直到一切都设置好
变量x=0
当我在空项目上运行此代码时(从viewDidLoad()运行someFunction()),我得到以下错误:2019-02-12 22:28:41.553015+0300 Nanopix Pilot[3891:189405][]nw_套接字_服务_写入_块_调用[C1:1]sendmsg(fd 5,3字节)[13:权限被拒绝]您正在尝试发送广播数据包;我不确定这是否允许。最好将数据包发送到您尝试与之通信的特定主机。非常感谢!我已成功连接到公共UDP服务器。下面我将编写最终代码,尝试在swift 5.x iOS 13上实现此功能。发送数据没有问题,但我似乎无法完成为了让它接收任何信息。我正在尝试使用python脚本发送一条简单的消息。你救了我的命!最终我能够使用Swift 5打开连接并向服务器发送消息,而无需将我的macOS升级到Catalina!谢谢!P.S:如果你需要使用TCP进行连接,也可以使用此示例,只需更改为UDP即可到TCP。如何使连接持续侦听?
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")
}
}
}
}
}