自定义一个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()