SwiftSocketSever

2017-11-25  本文已影响185人  br_MorningStar
  • 接受消息
  • 转发消息
  • ProtocolBuffer

TCP/UDP的概念和区分




图片.png
  1. cocoapods
 pod 'SwiftSocket'
 pod 'ProtocolBuffers-Swift'
  1. 创建SeverSocketManager文件管理Sever
class SeverSocketManager {
    
    fileprivate var severSocket : TCPServer = TCPServer(address: "0.0.0.0", port: 5656)
    fileprivate var isSeverSocketRunning : Bool = false
    fileprivate lazy var clientManagerArray : [ClientManager] = [ClientManager]()

}
extension SeverSocketManager {
    func startSever() ->((String , Bool)){
         let flag = severSocket.listen()  //开启监听
        
        if flag.isSuccess {
            
            isSeverSocketRunning = true
            
            DispatchQueue.global().async {    //开启新线程
                while self.isSeverSocketRunning {    

                    if let client = self.severSocket.accept(){  //循环接受ClientSocket
                        
                        DispatchQueue.global().async {
                         self.handleClient(client)    //处理接收到的ClientSocket

                        }
                    }
                }
            }
            return ("开启成功",flag.isSuccess)
        }else{
            return ("开启失败",flag.isFailure)
        }

    }
    
    func stopSever(){
        isSeverSocketRunning = false
    }
}

  1. 处理ClientSocket
extension SeverSocketManager {
    fileprivate func handleClient (_ client : TCPClient){
        let mgr = ClientManager(tcpClient: client)
        mgr.delegate = self
        //保存客户端
        clientManagerArray.append(mgr)
        
        //用Client开始接受消息(读取消息)
        mgr.startRedMsg()
    }
}

extension SeverSocketManager : ClientManagerDelegate{
    
    func deleteClient(clientManager: ClientManager) {
        clientManager.tcpClient.close()
        guard let index = clientManagerArray.index(of: clientManager) else {return}
        clientManagerArray.remove(at: index)
        print(clientManagerArray.count)
    }
    
    func sendMsgClientTo(_ data: Data) {
        let str = String(data: data, encoding: .utf8)
        print(str!)
        for mgr in clientManagerArray{
            mgr.tcpClient.send(data: data)

        }
    }
}
  1. 创建ClientManager管理Client
protocol ClientManagerDelegate : class{
    func sendMsgClientTo(_ data : Data)
    func deleteClient(clientManager : ClientManager)
}
class ClientManager: NSObject {
    weak var delegate :  ClientManagerDelegate?
    var tcpClient : TCPClient
    fileprivate var isClientConnected : Bool = false    //连接状态
    fileprivate var heartTimeCount : Int = 0            //心跳包计时
    
    init(tcpClient : TCPClient) {
        self.tcpClient = tcpClient
    }
}
extension ClientManager{
    func startRedMsg(){
        
        //心跳包计时
        let timer = Timer(fireAt: Date(), interval: 1, target: self, selector: #selector(checkHeartBeat), userInfo: nil, repeats: true)
        RunLoop.current.add(timer, forMode: .commonModes)
        timer.fire()
        
        isClientConnected = true
        while isClientConnected {
            if let msg = tcpClient.read(4){    //读取4个字节
                //读取Header的长度
                let headerData = Data(bytes: msg, count: 4) //字节传承Data
                var length : Int = 0
                (headerData as NSData).getBytes(&length, length: 4)  //获取消息的长度
                
                //读取类型
                guard let messageType = tcpClient.read(2) else { return }
                let typeData = Data(bytes: messageType, count: 2)   //把类型转换成Data
                var type : Int = 0
                (typeData as NSData).getBytes(&type, length: 2)     //获取类型的长度
                //                print("type = \(type)")                             //获取类型
                
                //                print(length)
                //根据长度读取真正的消息
                guard let trueMsg = tcpClient.read(length) else { return }
                let data = Data(bytes: trueMsg, count: length)
                
                //1表示离开,断开连接
                if type == 1{    
                    DispatchQueue.main.async {
                        self.delegate?.deleteClient(clientManager: self)
                    }
                }
                else if type == 100{      //100消息类型(心跳包消息类型)
                    heartTimeCount = 0    //如果接收到心跳包则重置时间
                    let message = String(data: data, encoding: .utf8)
                    print(message!)
                    continue
                }

                //Data拼接转发
                let totalData = headerData + typeData + data
                delegate?.sendMsgClientTo(totalData)
                
            }else{
                removeClient()
            }
        }
    }
    @objc fileprivate func checkHeartBeat(){
        print("-------------")
        heartTimeCount += 1
        if heartTimeCount >= 10 {
            removeClient()
        }
    }
    
    fileprivate func removeClient(){
    
        isClientConnected = false
        print("客户端断开了链接")
        //从数组中删除ClientSocket
        delegate?.deleteClient(clientManager: self)
    }
}
class ViewController: NSViewController {

    fileprivate lazy var severSocketManager : SeverSocketManager = SeverSocketManager()
    
    @IBOutlet weak var messageLabel: NSTextField!
    override func viewDidLoad() {
        super.viewDidLoad()

        
    }
    @IBAction func start(_ sender: NSButton) {
        let flag = severSocketManager.startSever()
        if flag.1{
            messageLabel.stringValue = "succeed"
            messageLabel.textColor = .green
        }else{
            messageLabel.stringValue = "fail"
            messageLabel.textColor = .red
        }
    }
    
    @IBAction func stop(_ sender: NSButton) {
        
    }
    
}```
上一篇 下一篇

猜你喜欢

热点阅读