2014-11-06 2 views
13

배경 :스위프트 : GCDAsyncUdpSocket으로 UDP 수신

내 iOS 앱과 서버간에 UDP 패킷을주고받을 수 있기를 원합니다. 서버는 들어오는 모든 메시지를 클라이언트에 다시 표시합니다. 서버가 테스트되고 작동중인 것으로 확인되었습니다.. 나는 GCDAsyncUdpSocketDelegate를 구현하는 두 개의 클래스를 시작하는 StartViewController를 가지고있다. 하나는 전송 용이고 다른 하나는 수신 용이다. "송신 소켓"이 작동하면 서버가 메시지를 수신합니다.

문제 :

응용이 전송되었습니다 다시 후에 들어오는 메시지가 없습니다. didReceiveData가 결코 호출되지 않기 때문에 리스닝 소켓 설정을 사용하는 것이 잘못된 것입니다.

완전히 잘못 했습니까?

시작 :

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

는 수신 :

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

보내기 :

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

편집 : 추가 잊어 코드 라인을.

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) 
} 
+3

정확히 InSocket에 소켓 속성을 초기화 할 경우 : – Anton

+0

Anton. 눈치 채기위한 Thx. 그것은 프로젝트 코드에서 복사/붙여 넣기 실수 였고 방금 추가했습니다. 소켓 initialazion 내 프로젝트 코드에 있기 때문에 그러나 이것은 문제가되지 않습니다. – rilar

답변

9

나는 마침내이 소켓의 설치 작업을 얻었다. setupConnection?
+1

이것은 나에게 큰 도움이되었습니다. – Mellson

+0

이전 스레드를 다시 열어서 죄송합니다. Swift 2.1에서 함수를 사용하기 위해 예제를 변환하려고합니다. 답변에서 'SERVER_IP'참조가 실제로 무엇을 가리키는 지 약간 확실하지 않습니다. 어디서나 인스턴스화 된 것을 찾을 수없는 것 같습니다. – ZbadhabitZ

+0

죄송합니다. SERVER_IP는 문자열입니다. – rilar