iOS CocoaAsyncSocket 使用教程(Swift3.0版)

Socket 就是對(duì)于傳輸層 TCP/IP 的封裝

簡(jiǎn)述:

由于最近項(xiàng)目的需要,需要使用到 Socket,所以就趁此整理了一下,網(wǎng)上對(duì)于 Socket 的理論知識(shí)有很多,這里就不必多說(shuō),此篇文章主要在 Swift 環(huán)境下使用 CocoaAsyncSocket 庫(kù),來(lái)實(shí)現(xiàn)一個(gè)非常簡(jiǎn)單的 Socket 連接的例子。

1.創(chuàng)建 Swift 工程,并使用 Cocoapods 導(dǎo)入 CocoaAsyncSocket

1.創(chuàng)建工程

Cocoapods:

use_frameworks!

pod 'CocoaAsyncSocket'

2.搭建服務(wù)端和客戶端 UI

使用 Tabbar 分別創(chuàng)建服務(wù)端界面和客戶端界面

3.服務(wù)端和客戶端的界面搭建

分別創(chuàng)建服務(wù)端和客戶端 ViewController 并關(guān)聯(lián)相關(guān) Textfield 和 Button

4.服務(wù)端創(chuàng)建 Socket 綁定端口,設(shè)置監(jiān)聽,消息發(fā)送等方法

ServerViewController

5.客戶端創(chuàng)建 Socket,設(shè)置連接,消息發(fā)送,讀取,斷開連接等方法

ClientViewController


import UIKit

import CocoaAsyncSocket

class ServerViewController:UIViewController{

? ? //端口

? ? @IBOutlet weak var portTF:UITextField!

? ? //消息

? ? @IBOutlet weak var msgTF:UITextField!

? ? //信息顯示

? ? @IBOutlet weak var infoTV:UITextView!

? ? var serverSocket:GCDAsyncSocket?

? ? var clientSocket:GCDAsyncSocket?

? ? override func viewDidLoad() {

? ? super.viewDidLoad()

? ? addText(text:"顯示檢測(cè)(服務(wù)端)")

}

//對(duì)InfoTextView添加提示內(nèi)容

func addText(text:String) {

? ? infoTV.text=infoTV.text.appendingFormat("%@\n", text)

}

//監(jiān)聽

@IBAction func listeningAct(_sender:Any) {

? ? serverSocket = GCDAsyncSocket(delegate:self, delegateQueue:DispatchQueue.main)

? ? do{

? ? ? ? try serverSocket?.accept(onPort:UInt16(portTF.text!)!)

? ? ? ? ? ? addText(text:"監(jiān)聽成功")

? ? }

? ? catch_{

? ? ? ? addText(text:"監(jiān)聽失敗")

? ? }

}

//發(fā)送

@IBAction func sendAct(_sender:Any) {

? ? let data = msgTF.text?.data(using:String.Encoding.utf8)

? ? //向客戶端寫入信息Timeout設(shè)置為-1則不會(huì)超時(shí), tag作為兩邊一樣的標(biāo)示

? ? clientSocket?.write(data!, withTimeout:-1, tag:0)

}

extension ServerViewController:GCDAsyncSocketDelegate {

? ? //當(dāng)接收到新的Socket連接時(shí)執(zhí)行

? ? func socket(_sock:GCDAsyncSocket, didAcceptNewSocket newSocket:GCDAsyncSocket) {

? ? ? ? addText(text:"連接成功")

? ? ? ? addText(text:"連接地址"+ newSocket.connectedHost!)

? ? ? ? addText(text:"端口號(hào)"+String(newSocket.connectedPort))

? ? ? ? clientSocket = newSocket

? ? ? ? //第一次開始讀取Data

? ? ? ? clientSocket!.readData(withTimeout:-1, tag:0)

? ? }

? ? func socket(_sock:GCDAsyncSocket, didRead data:Data, withTag tag:Int) {

? ? ? ? let message = String(data: data,encoding:String.Encoding.utf8)

? ? ? ? addText(text: message!)

? ? ? ? //再次準(zhǔn)備讀取Data,以此來(lái)循環(huán)讀取Data

? ? ? ? sock.readData(withTimeout:-1, tag:0)

? ? }

}

import UIKit

import CocoaAsyncSocket

class ClientViewController:UIViewController{

? ? // IP地址

? ? @IBOutlet weak var ipTF:UITextField!

? ? //端口

? ? @IBOutlet weak var portTF:UITextField!

? ? //消息

? ? @IBOutlet weak var msgTF:UITextField!

? ? //消息顯示

? ? @IBOutlet weak var infoTV:UITextView!

? ? var socket:GCDAsyncSocket?

? ? override func viewDidLoad() {

? ? ? ? super.viewDidLoad()

? ? ? ? addText(text:"顯示檢測(cè)(客戶端)")

? ? }

? ? func addText(text:String) {

? ? ? ? infoTV.text=infoTV.text.appendingFormat("%@\n", text)

? ? }

? ? //連接

? ? @IBAction func connectionAct(_sender:Any) {

? ? ? ? socket = GCDAsyncSocket(delegate:self, delegateQueue:DispatchQueue.main)

? ? ? ? do{

? ? ? ? ? ? try socket?.connect(toHost: ipTF.text!, onPort:UInt16(portTF.text!)!)

? ? ? ? ? ? ? ? addText(text:"連接成功")

? ? ? ? ? ? }

? ? ? ? catch_{

? ? ? ? ? ? addText(text:"連接失敗")

? ? ? ? }

? ? }

? ? //斷開

? ? @IBAction func disconnectAct(_sender:Any) {

? ? ? ? socket?.disconnect()

? ? ? ? addText(text:"斷開連接")

? ? }

? ? //發(fā)送

? ? @IBAction func sendMsgAct(_sender:Any) {

? ? ? ? socket?.write((msgTF.text?.data(using:String.Encoding.utf8))!, withTimeout:-1, tag:0)

? ? }

}

extension ClientViewController:GCDAsyncSocketDelegate {

? ? func socket(_sock:GCDAsyncSocket, didConnectToHost host:String, port:UInt16) {

? ? ? ? addText(text:"連接服務(wù)器"+host)

? ? ? ? self.socket?.readData(withTimeout:-1, tag:0)

? ? }

? ? func socket(_sock:GCDAsyncSocket, didRead data:Data, withTag tag:Int) {

? ? ? ? letmsg = String(data: dataasData, encoding:String.Encoding.utf8)

? ? ? ? addText(text: msg!)

? ? ? ? socket?.readData(withTimeout:-1, tag:0)

? ? }

}

Demo 地址

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

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

  • iPhone的標(biāo)準(zhǔn)推薦是CFNetwork 庫(kù)編程,其封裝好的開源庫(kù)是 cocoa AsyncSocket庫(kù),用它...
    Ethan_Struggle閱讀 2,366評(píng)論 2 12
  • 轉(zhuǎn)載:http://www.cocoachina.com/ios/20170615/19529.html 參考:h...
    F麥子閱讀 4,144評(píng)論 3 2
  • iPhone的標(biāo)準(zhǔn)推薦是CFNetwork 庫(kù)編程,其封裝好的開源庫(kù)是 cocoa AsyncSocket庫(kù),用它...
    夜殤丶夜逝閱讀 4,156評(píng)論 1 23
  • CocoaAsyncSocket支持tcp和udp。其中: AsyncSocket類是支持TCP的 AsyncUd...
    鄭軍紅閱讀 1,774評(píng)論 0 2
  • “好餓好餓好餓,我真的好餓~” 如果說(shuō)凌晨?jī)牲c(diǎn)多被餓醒是該繼續(xù)睡還是爬起床找吃的? 放在之前我肯定選擇繼續(xù)睡,對(duì)我...
    請(qǐng)叫我徐老師x閱讀 492評(píng)論 0 0

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