Swift基于CocoaAsyncSocket开发Socket通信

首先我们以实现方式来切入,基本上有以下四种实现方式:

https://github.com/zhangrongwu/Swift-IM.git

基于Scoket原生:代表框架 CocoaAsyncSocket
基于WebScoket:代表框架 SocketRocket
基于MQTT:代表框架 MQTTKit
基于XMPP:代表框架 XMPPFramework

添加CocoaAsyncSocket

 import CocoaAsyncSocket

添加代理

class SESocketManager: NSObject, GCDAsyncSocketDelegate  {

}

初始化与长连接建立

var clientSocket:GCDAsyncSocket!

override init() {
    super.init()
    clientSocket = GCDAsyncSocket()
    clientSocket.delegate = self
    clientSocket.delegateQueue = DispatchQueue.main
    creatSocketToConnectServer()
}

 // 创建长连接
func creatSocketToConnectServer() -> Void {
    do {
        connectStatus = 0
        try  clientSocket.connect(toHost: kConnectorHost, onPort: UInt16(kConnectorPort), withTimeout: TimeInterval(timeOut))
    } catch {
        print("conncet error")
    }
}

长连接建立成功后代理回调

func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) -> Void {
    print("Successful")
    socketDidConnectCreatLogin()
    socketDidConnectBeginSendBeat()
}

建立连接成功后向服务器检验登录与发送心跳包

   // 长连接建立后 开始与服务器校验登录
func socketDidConnectCreatLogin() -> Void {
    let login = ["c":"1","p":"ca5542d60da951afeb3a8bc5152211a7","d":"dev_"]
    socketWriteDataToServer(body: login)
    reconnectionCount = 0
    connectStatus = 1
    reconncetStatusHandle?(true)
    delegate?.reconnectionSuccess()
    guard let timer = self.reconnectTimer else {
        return
    }
    timer.invalidate()
}

// 长连接建立后 开始发送心跳包
func socketDidConnectBeginSendBeat() -> Void {
    beatTimer = Timer.scheduledTimer(timeInterval: TimeInterval(heartBeatTimeinterval),
                                     target: self,
                                     selector: #selector(sendBeat),
                                     userInfo: nil,
                                     repeats: true)
    RunLoop.current.add(beatTimer, forMode: RunLoopMode.commonModes)
}

// 向服务器发送心跳包
func sendBeat() {
    let beat = ["c":"3"]
    socketWriteDataToServer(body:beat)
}

向服务器发送数据

 // 向服务器发送数据
func socketWriteDataToServer(body: Dictionary<String, Any>) {
    // 1: do   2: try?    3: try!
    guard let data:Data = try? Data(JSONSerialization.data(withJSONObject: body,
                                                           options: JSONSerialization.WritingOptions(rawValue: 1))) else { return }
    print(body)
    clientSocket.write(data, withTimeout: -1, tag: 0)
    clientSocket.readData(to: GCDAsyncSocket.crlfData(), withTimeout: -1, tag: 0)
}

发送与接收数据代理回调

 // 服务器接收到数据 -->> 接收到数据后抛出去
func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) -> Void {
    clientSocket.write(data, withTimeout: -1, tag: 0)
    clientSocket.readData(to: GCDAsyncSocket.crlfData(), withTimeout: -1, tag: 0)
    socketDidReadData(data: data, tag: tag)
}


func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) -> Void {
    clientSocket.readData(to: GCDAsyncSocket.crlfData(), withTimeout: -1, tag: 0)
}

// 断开连接
func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) -> Void {
    socketDidDisconectBeginSendReconnect()
}

刚上手Swift, 带有语法错误请谅解

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

推荐阅读更多精彩内容

  • 这两天都有在微信公众平台和简书上看到关于各种“父母逼迫儿女找对象”、“为什么找不到男(女)朋友”之类的话题。 ...
    ___沁阅读 288评论 0 2
  • 走到城门前,左右两边的守卫连忙走过来和七公主拜见,七公主说:身后这两位是我的朋友,你们各自忙自己的去吧!说完然后她...
    victory527阅读 926评论 2 3