专栏首页移动端周边技术扩展Swift基于CocoaAsyncSocket开发Socket通信

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, 带有语法错误请谅解

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于CocoaAsyncSocket中的tag值问题

    程序员不务正业
  • Vue(CLI3.0)多环境配置问题2020

    程序员不务正业
  • iOS 7 之后UITextView 最后一行显示bug

    程序员不务正业
  • RSA 2018:从大会议题看2018年网络安全趋势

    根据RSA 2018大会提交的议题资料,可以发现我们正处于安全领域的一大关键性时刻,而明年4月的大会也必将满载激动人心的精彩内容。除了即将出台的全球性重大政策与...

    企鹅号小编
  • pandas的基本用法——数据定义及使用

    Tyan
  • 预警 | Linux 服务器惊现比特币勒索事件,做好四点可免遭损失

    腾讯云安全
  • 腾讯双11活动全解析

    众所周知,腾讯云一直被大家称为良心云,而隔壁的套路云也已在举行双11的活动,但套路太多,反观腾讯云要良心很多,也更直接,跟着我一起来看看吧。

    Flicker
  • Dubbo 源码解析 —— 集群容错架构设计

    前言 本来是想把整个dubbo源码解析一次性弄完,再做成一个系列来发布的,但是正巧最近有位好朋友要去杭州面试,就和我交流了一下.本着对dubbo源码略有心得的心...

    芋道源码
  • 《精通CSS》第3章 可见格式化模型

    第 3 章仍是本书的基础章节。本章将会给大家介绍盒模型相关的概念、几种常见的可见格式化模型(包括定位、浮动、格式化上下文)以及新型布局模块,其中较新的布局方式将...

    歪马
  • Oracle ROWID 方式访问数据库

        和ROWNUM一样,ROWID是一个伪列,即是一个非用户定义的列,而又实际存储于数据库之中。每一个表都有一个ROWID列,一个ROWID值用于 唯一确定...

    Leshami

扫码关注云+社区

领取腾讯云代金券