2014-11-06 11 views
13

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.

+3

Wo genau Sie Ihre Socket-Eigenschaft in InSocket initialisieren. setupVerbindung? – Anton

+0

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

Antwort

9

ich habe es endlich mit diesem Socket-Setup zu arbeiten:

func setupConnection(){ 
    var error : NSError? 
    socket = GCDAsyncUdpSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 
    socket.bindToPort(PORT, error: &error) 
    socket.connectToHost(SERVER_IP, onPort: PORT, error: &error) 
    socket.beginReceiving(&error) 
    send("ping") 
} 

func send(message:String){ 
    let data = message.dataUsingEncoding(NSUTF8StringEncoding) 
    socket.sendData(data, withTimeout: 2, tag: 0) 
} 
+1

thx das war eine große Hilfe für mich! – Mellson

+0

Es tut mir leid, einen älteren Thread erneut zu öffnen, aber ich versuche, Ihr Beispiel in Swift 2.1 zu konvertieren, und mir ist unklar, worauf sich die 'SERVER_IP' in Ihrer Antwort bezieht. Ich kann das nirgendwo instanziiert finden. – ZbadhabitZ

+0

Es tut uns leid, dass SERVER_IP eine Zeichenfolge ist. – rilar

Verwandte Themen