HINTERGRUND:Swift: Empfangen UDP mit GCDAsyncUdpSocket
Ich möchte senden zu können und empfangen UDP-Pakete zwischen meinem iOS-App und einem Server. Der Server gibt jede eingehende Nachricht an den Client der App zurück. Der Server wurde getestet und funktioniert. Ich habe einen StartViewController, der zwei Klassen startet, die GCDAsyncUdpSocketDelegate implementieren, einen zum Senden und einen zum Empfangen. Der "sendende Socket" funktioniert, der Server empfängt die Nachrichten.
PROBLEM:
Die App nie die eingehende Nachricht zurück, nachdem es gesendet wurde. Irgendetwas mit dem Setup des Abhörsockets ist wahrscheinlich falsch, da didReceiveData niemals aufgerufen wird.
Habe ich das komplett falsch gemacht?
Start:
class StartViewController: UIViewController {
var inSocket : InSocket!
var outSocket : OutSocket!
override func viewDidLoad() {
super.viewDidLoad()
inSocket = InSocket()
outSocket = OutSocket()
}
@IBAction func goButton(sender: UIButton) {
outSocket.send("This is a message!")
}
}
Empfangen:
class InSocket: NSObject, GCDAsyncUdpSocketDelegate {
let IP = "255.255.255.255"
let PORT:UInt16 = 5556
var socket:GCDAsyncUdpSocket!
override init(){
super.init()
setupConnection()
}
func setupConnection(){
var error : NSError?
socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
socket.bindToPort(PORT, error: &error)
socket.enableBroadcast(true, error: &error)
socket.joinMulticastGroup(IP, error: &error)
socket.beginReceiving(&error)
}
func udpSocket(sock: GCDAsyncUdpSocket!, didReceiveData data: NSData!, fromAddress address: NSData!, withFilterContext filterContext: AnyObject!) {
println("incoming message: \(data)");
}
}
Senden:
class OutSocket: NSObject, GCDAsyncUdpSocketDelegate {
let IP = "90.112.76.180"
let PORT:UInt16 = 5556
var socket:GCDAsyncUdpSocket!
override init(){
super.init()
setupConnection()
}
func setupConnection(){
var error : NSError?
socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue())
socket.connectToHost(IP, onPort: PORT, error: &error)
}
func send(message:String){
let data = message.dataUsingEncoding(NSUTF8StringEncoding)
socket.sendData(data, withTimeout: 2, tag: 0)
}
func udpSocket(sock: GCDAsyncUdpSocket!, didConnectToAddress address: NSData!) {
println("didConnectToAddress");
}
func udpSocket(sock: GCDAsyncUdpSocket!, didNotConnect error: NSError!) {
println("didNotConnect \(error)")
}
func udpSocket(sock: GCDAsyncUdpSocket!, didSendDataWithTag tag: Int) {
println("didSendDataWithTag")
}
func udpSocket(sock: GCDAsyncUdpSocket!, didNotSendDataWithTag tag: Int, dueToError error: NSError!) {
println("didNotSendDataWithTag")
}
}
Edit: Hinzugefügt vergessen Codezeile.
Wo genau Sie Ihre Socket-Eigenschaft in InSocket initialisieren. setupVerbindung? – Anton
Anton. Danke für's Bemerken. Das war ein Fehler beim Kopieren/Einfügen aus meinem Projektcode, den ich gerade hinzugefügt habe. Dies ist jedoch nicht das Problem, da die Socket-Initialisierung in meinem Projektcode vorhanden ist. – rilar