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

Socket 就是对于传输层 TCP/IP 的封装

简述:

由于最近项目的需要,需要使用到 Socket,所以就趁此整理了一下,网上对于 Socket 的理论知识有很多,这里就不必多说,此篇文章主要在 Swift 环境下使用 CocoaAsyncSocket 库,来实现一个非常简单的 Socket 连接的例子。

1.创建 Swift 工程,并使用 Cocoapods 导入 CocoaAsyncSocket

1.创建工程

Cocoapods:

use_frameworks!

pod 'CocoaAsyncSocket'

2.搭建服务端和客户端 UI

使用 Tabbar 分别创建服务端界面和客户端界面

3.服务端和客户端的界面搭建

分别创建服务端和客户端 ViewController 并关联相关 Textfield 和 Button

4.服务端创建 Socket 绑定端口,设置监听,消息发送等方法

ServerViewController

5.客户端创建 Socket,设置连接,消息发送,读取,断开连接等方法

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:"显示检测(服务端)")

}

//对InfoTextView添加提示内容

func addText(text:String) {

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

}

//监听

@IBAction func listeningAct(_sender:Any) {

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

    do{

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

            addText(text:"监听成功")

    }

    catch_{

        addText(text:"监听失败")

    }

}

//发送

@IBAction func sendAct(_sender:Any) {

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

    //向客户端写入信息Timeout设置为-1则不会超时, tag作为两边一样的标示

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

}

extension ServerViewController:GCDAsyncSocketDelegate {

    //当接收到新的Socket连接时执行

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

        addText(text:"连接成功")

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

        addText(text:"端口号"+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!)

        //再次准备读取Data,以此来循环读取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:"显示检测(客户端)")

    }

    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:"断开连接")

    }

    //发送

    @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:"连接服务器"+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 地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容