记录一下swift使用Socket聊天业务的实现

自定义一个Session类。
步骤一:导入CocoaAsyncSocket库

import CocoaAsyncSocket

步骤二:创建GCDAsyncSocket实例 创建心跳包的数据

let socket = GCDAsyncSocket(delegate: self, delegateQueue: DispatchQueue.main)
let heartbeatMessage = "server_ping" //和后台对应的message
// 使用Timer来定期发送心跳包
let heartbeatInterval: TimeInterval = 30 // 心跳间隔时间,单位秒
let heartbeatTimer = Timer.scheduledTimer(withTimeInterval: heartbeatInterval, repeats: true) { [weak self] timer in
    guard let self = self else { return }
    if self.socket.isConnected {
        self.socket.write(heartbeatMessage.data(using: .utf8)!, withTimeout: -1, tag: 999) // 使用一个特殊的tag来标识心跳包
    }
}

步骤三:设置代理并实现协议方法

extension Session: GCDAsyncSocketDelegate {
    func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {
        print("连接成功: \(host):\(port)")
        // 可以在这里发送数据
    }

    func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
        print("连接断开: \(err?.localizedDescription ?? "未知错误")")
    }

    func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
        // 处理接收到的数据
        if tag == 999 {
            // 处理心跳响应
            print("收到心跳响应")
        } else {
            // 处理其他数据
            if let message = String(data: data, encoding: .utf8) {
                print("收到消息: \(message)")
            } else {
              // 其他数据
            }
        }
    }
        
}

步骤四:连接到服务器

let host = "your.server.com"
let port: UInt16 = 12345 // 服务器端口
socket.connect(toHost: host, onPort: port, withTimeout: -1, tag: 0)

步骤五:发送数据

if let message = "你好,服务器".data(using: .utf8) {
    socket.write(message, withTimeout: -1, tag: 1)
}

步骤七:断开连接

完成通信后,可以使用disconnect()方法断开连接。

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

推荐阅读更多精彩内容