美文网首页swift4.0
CocoaAsyncSocket-socket连接管理类

CocoaAsyncSocket-socket连接管理类

作者: 279cb620c509 | 来源:发表于2019-02-20 10:37 被阅读0次

    自己用的socket连接管理类

    pod 'CocoaAsyncSocket'

    import Foundation
    import CocoaAsyncSocket
    
    typealias ZZWSocketManagerBlock = (_ data:Data) -> Void
    
    typealias ZZWSocketIsAlreadyConnectionedBlock = (_ isconnection:Bool) -> Void
    
    class ZZWSocketManager: NSObject {
        
        var socketIsAlreadyConnectionedBlock:ZZWSocketIsAlreadyConnectionedBlock?
        var socketManagerBlock:ZZWSocketManagerBlock?
        
        class var shared: ZZWSocketManager {
            return Inner.instance
        }
        struct Inner {
            static let instance = ZZWSocketManager()
        }
        var  socketManger:GCDAsyncSocket?
        var sourcedata :Data   = Data(capacity: 0)
        
        func setSocketManager()  {
            socketManger = GCDAsyncSocket(delegate: self , delegateQueue: DispatchQueue.main)
            socketManger?.disconnectAfterReadingAndWriting()
            
            
        }
        
        func tryLinkSocket(_ host:String,_ port:Float) ->  Bool{
            
            do {
                try self.socketManger?.connect(toHost: host, onPort: UInt16(port), withTimeout: 10)
                
                return true
                
            }catch _ {
                socketIsAlreadyConnectionedBlock!(false)
                LTLog( "连接失败,请断开链接重新链接设备")
                return false
            }
        }
        
      //writeData写入socket数据一般为字符指令
        func writeData(_ writeString:String = "PIC") ->  ZZWSocketManager {
            let strData = writeString.data(using: String.Encoding.utf8)
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) { [weak self] in
                self?.socketManger?.write(strData!, withTimeout: 40, tag: 0)
             
            }
            
            return self
        }
        
        
        func afterTimesCheckDidReceiveData() ->  ZZWSocketManager {
        
            DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + 180) { [weak self] in
                
                if !socket_receiveImageData {
                    self?.noticeError("获取数据失败", autoClear: true, autoClearTime: 3)
                }
                
            }
            
            return self
        }
        
        func socketManagerBlockFunction(socketManagerB:@escaping ZZWSocketManagerBlock){
            
            socketManagerBlock = socketManagerB
            
        }
        
        func socketIsAlreadyConnectionedBlockFunction(socketManagerB:@escaping ZZWSocketIsAlreadyConnectionedBlock){
            
            socketIsAlreadyConnectionedBlock = socketManagerB
            
        }
    }
    
    extension ZZWSocketManager : GCDAsyncSocketDelegate,FinalLinkSuccessProtocol{
        func socket(_ sock: GCDAsyncSocket, didConnectToHost host: String, port: UInt16) {
           
            socketIsAlreadyConnectionedBlock!(true)
            sock.readData(withTimeout: -1, tag: 0)
             
        }
    
      
        
        func socket(_ sock: GCDAsyncSocket, didReadPartialDataOfLength partialLength: UInt, tag: Int) {
    //        LTLog("partialLength %@, \(partialLength)")
        }
        
        
        func socketDidDisconnect(_ sock: GCDAsyncSocket, withError err: Error?) {
            
            let error :NSString = "\(String(describing: err))" as NSString
            
            socketIsAlreadyConnectionedBlock!(false)
                
        }
        
        
        func socket(_ sock: GCDAsyncSocket, didWriteDataWithTag tag: Int) {
            sock.readData(withTimeout: -1, tag: 0)
        
        }
        
        func socket(_ sock: GCDAsyncSocket, didRead data: Data, withTag tag: Int) {
         
            DispatchQueue.main.async { [weak self] in
                self?.sourcedata.append(data)
            }
    
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.001) {
                sock.readData(withTimeout: -1, tag: 0)
            }
            
            if data.count < 1{
              socketManagerBlock!("NO-data")
            }else{
              if socketManagerBlock != nil {
                socketManagerBlock!(data)
              }else{
                socketManagerBlock!("NO-data")
              }
              
            }
    
    
        }
        
        
    }
    

    使用:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
      ZZWSocketManager.shared.setSocketManager()
    }
    //连接socket
    ZZWSocketManager.shared.tryLinkSocket(host, port)
    //发送信息
    ZZWSocketManager.shared.writeData().afterTimesCheckDidReceiveData()
    
    ZZWSocketManager.shared.socketIsAlreadyConnectionedBlockFunction { (isconnection) in
            //连接成功/失败 do。。。
        }
    ZZWSocketManager.shared.socketManagerBlockFunction { [weak self] (data) in
                            //接收socket数据  do。。。                            
                                                       }
    

    相关文章

      网友评论

        本文标题:CocoaAsyncSocket-socket连接管理类

        本文链接:https://www.haomeiwen.com/subject/xopcyqtx.html