前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swift基于CocoaAsyncSocket开发Socket通信

Swift基于CocoaAsyncSocket开发Socket通信

作者头像
程序员不务正业
发布2018-06-13 16:41:41
1.9K0
发布2018-06-13 16:41:41
举报
文章被收录于专栏:移动端周边技术扩展

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

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

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

添加CocoaAsyncSocket
代码语言:javascript
复制
 import CocoaAsyncSocket
添加代理
代码语言:javascript
复制
class SESocketManager: NSObject, GCDAsyncSocketDelegate  {

}
初始化与长连接建立
代码语言:javascript
复制
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")
    }
}
长连接建立成功后代理回调
代码语言:javascript
复制
func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) -> Void {
    print("Successful")
    socketDidConnectCreatLogin()
    socketDidConnectBeginSendBeat()
}
建立连接成功后向服务器检验登录与发送心跳包
代码语言:javascript
复制
   // 长连接建立后 开始与服务器校验登录
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)
}
向服务器发送数据
代码语言:javascript
复制
 // 向服务器发送数据
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)
}
发送与接收数据代理回调
代码语言:javascript
复制
 // 服务器接收到数据 -->> 接收到数据后抛出去
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, 带有语法错误请谅解

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.03.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 首先我们以实现方式来切入,基本上有以下四种实现方式:
    • https://github.com/zhangrongwu/Swift-IM.git
      • 添加CocoaAsyncSocket
        • 添加代理
          • 初始化与长连接建立
            • 长连接建立成功后代理回调
              • 建立连接成功后向服务器检验登录与发送心跳包
                • 向服务器发送数据
                  • 发送与接收数据代理回调
                  领券
                  问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档