2014-11-06 20 views
13

Wstęp:Swift: Otrzymuj UDP z GCDAsyncUdpSocket

Chcę, aby móc wysyłać i odbierać pakiety UDP między moim app iOS a serwerem. Serwer odsyła echo każdą przychodzącą wiadomość do klienta aplikacji. Serwer jest testowany i zatwierdzony pod numerem. Mam StartViewController, który uruchamia dwie klasy, które implementuje GCDAsyncUdpSocketDelegate, jeden do wysyłania i jeden do odbierania. "Gniazdo nadawcze" działa, serwer odbiera wiadomości.

PROBLEM:

Aplikacja nie pojawia się komunikat przychodzący z powrotem po to została wysłana. Coś z konfiguracją nasłuchującego gniazda jest prawdopodobnie błędne, ponieważ didReceiveData nigdy nie jest wywoływana.

Czy zrobiłem to zupełnie nie tak?

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!") 
    } 
} 

Pojemność:

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)"); 
    } 
} 

Wyślij:

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: Dodano zapomnianą linię kodu.

+3

Gdzie dokładnie masz zainicjalizować obiekt gniazda w InSocket. Ustaw połączenie? – Anton

+0

Anton. Thx za zauważenie. To był błąd w kopiowaniu/wklejaniu z mojego kodu projektu, właśnie go dodałem. Nie jest to jednak problemem, ponieważ początkowy stan gniazda znajduje się w moim kodzie projektu. – rilar

Odpowiedz

9

wreszcie dostałem go do pracy z tej konfiguracji gniazda:

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 to mi bardzo pomogło! – Mellson

+0

Przepraszam za ponowne otwarcie starszego wątku, ale próbuję przekonwertować twój przykład, aby działał z Swift 2.1, i jestem niejasny co do tego, do czego naprawdę odnosi się "SERVER_IP", do którego odwołujesz się w swojej odpowiedzi. Nie mogę znaleźć tego wystąpienia w dowolnym miejscu. – ZbadhabitZ

+0

Przepraszamy za to, że nie jest to bardziej jasne, SERVER_IP jest ciągiem znaków. – rilar