iOS開發(fā)之網(wǎng)絡(luò)通信(5)—— CocoaAsyncSocket

占位圖

文集

iOS開發(fā)之網(wǎng)絡(luò)通信(1)—— 計算機(jī)網(wǎng)絡(luò)
iOS開發(fā)之網(wǎng)絡(luò)通信(2)—— HTTP(S)
iOS開發(fā)之網(wǎng)絡(luò)通信(3)—— XML & JSON
iOS開發(fā)之網(wǎng)絡(luò)通信(4)—— socket
iOS開發(fā)之網(wǎng)絡(luò)通信(5)—— CocoaAsyncSocket
iOS開發(fā)之網(wǎng)絡(luò)通信(6)—— AFNetworking & Alamofire

目錄

  1. UDP
  2. TCP Server
  3. TCP Client
    Demo

CocoaAsyncSocket是一個異步socket庫,提供了macOS、iOS和tvOS版本,其底層基于BSD socket。
本文簡單介紹Swift下TCP和UDP用法。

1. UDP

// 創(chuàng)建socket
self.udpSocket = GCDAsyncUdpSocket(delegate: self, delegateQueue: .global())
do {
    // 綁定端口
    try self.udpSocket?.bind(toPort: UInt16(port))
    // 啟用廣播
    try self.udpSocket?.enableBroadcast(true)
    // 開始接收數(shù)據(jù)
    try self.udpSocket?.beginReceiving()
} catch {
    // 出錯,關(guān)閉socket
    self.udpSocket?.close()
    self.udpSocket = nil
    print("socket error")
}

// 發(fā)送數(shù)據(jù):可定向發(fā)送(如192.168.1.x)或者廣播(255.255.255.255)
self.udpSocket?.send(messageData, toHost: host, port: port, withTimeout: -1, tag: 0)  


//MARK: - GCDAsyncUdpSocketDelegate
// 發(fā)送成功
func udpSocket(_ sock: GCDAsyncUdpSocket, didSendDataWithTag tag: Int) {
    
    DispatchQueue.main.async {
        print("send: \(self.messageTF.text!), tag: \(tag)")
        self.showMessage("send: \(self.messageTF.text!), tag: \(tag)")
    }
}

// 發(fā)送失敗
func udpSocket(_ sock: GCDAsyncUdpSocket, didNotSendDataWithTag tag: Int, dueToError error: Error?) {
    
    print("didNotSendDataWithTag: \(tag), error: \(String(describing: error))")
    showMessage("didNotSendDataWithTag, error: \(String(describing: error))")
}

// 收到數(shù)據(jù)
func udpSocket(_ sock: GCDAsyncUdpSocket, didReceive data: Data, fromAddress address: Data, withFilterContext filterContext: Any?) {
    
    if let dataStr = String.init(data: data, encoding: .utf8) {
        print("receive: " + dataStr)
        showMessage("receive: " + dataStr)
    }
}

2. TCP Server

// 創(chuàng)建socket
func setup() {
    self.tcpServer = GCDAsyncSocket(delegate: self, delegateQueue: .global())
    self.tcpClients = [GCDAsyncSocket?]()
}

// 監(jiān)聽
func listen(port: UInt16) {
    do {
        // 檢測有無客戶端連接
        try self.tcpServer?.accept(onPort: port)
    } catch {
        print("accept error")
    }
}

// 關(guān)閉
func close() {
    // 斷開所有客戶端的連接
    guard self.tcpClients != nil,
          self.tcpClients!.count > 0 else {
        break
    }
    for tcpClient in self.tcpClients! {
        tcpClient?.disconnect()
    }
    // 斷開服務(wù)端連接
    self.tcpServer?.disconnect()
}

// 發(fā)送數(shù)據(jù)
func send(data: Data) {
    guard self.tcpClients != nil,
          self.tcpClients!.count > 0 else {
        return
    }
    for tcpClient in self.tcpClients! {
        tcpClient?.write(data, withTimeout: -1, tag: 0)
    }
}


//MARK: - GCDAsyncSocketDelegate

// 檢測到客戶端socket
func socket(_ sock: GCDAsyncSocket, didAcceptNewSocket newSocket: GCDAsyncSocket) {
    
    self.tcpClients?.append(newSocket)
    newSocket.readData(withTimeout: -1, tag: 0)
}

// 收到數(shù)據(jù)
func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
    
    DispatchQueue.main.async {
        if let message = String.init(data: data, encoding: .utf8) {
            self.showMessage(message: "receive: " + message)
            print("receive: " + message)
        }
    }
    
    sock.readData(withTimeout: -1, tag: 0)
}

// 發(fā)送成功
func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {
    
    DispatchQueue.main.async {
        if let message = self.messageTF.text {
            self.showMessage(message: "send: " + message)
            print("send: " + message)
        }
    }
}

// 出錯
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
    
    DispatchQueue.main.async {
        let message = "error: " + String(describing: err)
        self.showMessage(message: message)
        print(message)
    }
}

3. TCP Client

// 創(chuàng)建socket
func setup() {
    self.tcpClient = GCDAsyncSocket(delegate: self, delegateQueue: .global())
}

// 連接
func connect(host: String, port: UInt16) {
    do {
        try self.tcpClient?.connect(toHost: host, onPort: port)
    } catch {
        print("connect error")
        return
    }
}

// 關(guān)閉連接
func disconnect() {
    self.tcpClient?.disconnect()
}

// 發(fā)送數(shù)據(jù)
func send(data: Data) {
    self.tcpClient?.write(data, withTimeout: -1, tag: 0)
}


//MARK: - GCDAsyncSocketDelegate

// 連接成功
func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {
        
    sock.readData(withTimeout: -1, tag: 0)
        
    DispatchQueue.main.async {
        self.showMessage(message: "connected")
    }
}

// 收到數(shù)據(jù)
func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
    
    DispatchQueue.main.async {
        if let message = String.init(data: data, encoding: .utf8) {
            self.showMessage(message: "receive: " + message)
            print("receive: " + message)
        }
    }
    
    sock.readData(withTimeout: -1, tag: 0)
}

// 發(fā)送成功
func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {
    
    DispatchQueue.main.async {
        if let message = self.messageTF.text {
            self.showMessage(message: "send: " + message)
            print("send: " + message)
        }
    }
}

// 出錯
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
    
    DispatchQueue.main.async {
        let message = "error: " + String(describing: err)
        self.showMessage(message: message)
        print(message)
    }
}

Demo

KKSocketDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容