Swift: Receive UDP with GCDAsyncUdpSocket
I finally got it to work with this socket setup:
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)}
Apple Swift version 4.2.1 Well Tested UDP Example:-
STEP 1 :- pod 'CocoaAsyncSocket'
STEP 2 :- import CocoaAsyncSocket
in your UIViewController
.
STEP 3 :- UIViewController
import UIKitimport CocoaAsyncSocketclass ViewController: UIViewController { @IBOutlet weak var btnOnOff: LightButton! @IBOutlet weak var lblStatus: UILabel! var inSocket : InSocket! var outSocket : OutSocket! override func viewDidLoad() { super.viewDidLoad() lblStatus.isHidden = true inSocket = InSocket() outSocket = OutSocket() outSocket.setupConnection { self.lblStatus.isHidden = false } } @IBAction func btnLight(_ sender: Any) { let signal:Signal = Signal() self.outSocket.send(signal: signal) }}
STEP 4 :- Reciving Socket
//Reciving End...class InSocket: NSObject, GCDAsyncUdpSocketDelegate { //let IP = "10.123.45.2" let IP = "127.0.0.1" let PORT:UInt16 = 5001 var socket:GCDAsyncUdpSocket! override init(){ super.init() setupConnection() } func setupConnection(){ socket = GCDAsyncUdpSocket(delegate: self, delegateQueue:DispatchQueue.main) do { try socket.bind(toPort: PORT)} catch { print("")} do { try socket.enableBroadcast(true)} catch { print("not able to brad cast")} do { try socket.joinMulticastGroup(IP)} catch { print("joinMulticastGroup not proceed")} do { try socket.beginReceiving()} catch { print("beginReceiving not proceed")} } //MARK:-GCDAsyncUdpSocketDelegate func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) { print("incoming message: \(data)"); let signal:Signal = Signal.unarchive(d: data) print("signal information : \n first \(signal.firstSignal) , second \(signal.secondSignal) \n third \(signal.thirdSignal) , fourth \(signal.fourthSignal)") } func udpSocket(_ sock: GCDAsyncUdpSocket, didNotConnect error: Error?) { } func udpSocketDidClose(_ sock: GCDAsyncUdpSocket, withError error: Error?) { }}
STEP 5 :- Sending Socket..
//Sending End...class OutSocket: NSObject, GCDAsyncUdpSocketDelegate { // let IP = "10.123.45.1" let IP = "127.0.0.1" let PORT:UInt16 = 5001 var socket:GCDAsyncUdpSocket! override init(){ super.init() } func setupConnection(success:(()->())){ socket = GCDAsyncUdpSocket(delegate: self, delegateQueue:DispatchQueue.main) do { try socket.bind(toPort: PORT)} catch { print("")} do { try socket.connect(toHost:IP, onPort: PORT)} catch { print("joinMulticastGroup not proceed")} do { try socket.beginReceiving()} catch { print("beginReceiving not proceed")} success() } func send(signal:Signal){ let signalData = Signal.archive(w: signal) socket.send(signalData, withTimeout: 2, tag: 0) } //MARK:- GCDAsyncUdpSocketDelegate func udpSocket(_ sock: GCDAsyncUdpSocket, didConnectToAddress address: Data) { print("didConnectToAddress"); } func udpSocket(_ sock: GCDAsyncUdpSocket, didNotConnect error: Error?) { if let _error = error { print("didNotConnect \(_error )") } } func udpSocket(_ sock: GCDAsyncUdpSocket, didNotSendDataWithTag tag: Int, dueToError error: Error?) { print("didNotSendDataWithTag") } func udpSocket(_ sock: GCDAsyncUdpSocket, didSendDataWithTag tag: Int) { print("didSendDataWithTag") }}
STEP 6 :- Your Signal Data which you will Send/Recieve
import Foundationstruct Signal { var firstSignal:UInt16 = 20 var secondSignal:UInt16 = 30 var thirdSignal: UInt16 = 40 var fourthSignal: UInt16 = 50 static func archive(w:Signal) -> Data { var fw = w return Data(bytes: &fw, count: MemoryLayout<Signal>.stride) } static func unarchive(d:Data) -> Signal { guard d.count == MemoryLayout<Signal>.stride else { fatalError("BOOM!") } var s:Signal? d.withUnsafeBytes({(bytes: UnsafePointer<Signal>)->Void in s = UnsafePointer<Signal>(bytes).pointee }) return s! }}