Swift:用GCDAsyncUdpSocket接收UDP

背景:

我想能够发送和接收我的iOS应用程序和服务器之间的UDP数据包。 服务器将每个传入的消息回显给客户端应用程序。 服务器经过testing并确认工作 。 我有一个StartViewController,它启动两个实现GCDAsyncUdpSocketDelegate的类,一个用于发送,另一个用于接收。 “发送套接字”正在工作,服务器收到消息。

问题:

该应用程序发送后永远不会收到传入的消息。 与侦听套接字设置的东西可能是错误的,因为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) }