Socket

作者: 竹尖 | 来源:发表于2017-09-06 19:40 被阅读0次

    manager管家  --- 交给client处理  其实还是服务器在处理---client中block回调还是让服务器处理而已

    服务器

    1> 创建Socket

    2> 绑定端口

    3> 监听listen

    4> 接受客户端的链接(accept) socket

    * 阻塞式的函数

    */

    如果离开房间 

    client.callback = {[unowned self] (isLeave, data, client) in

    // 1.是否需要移动客户端

    if isLeave {

    if let index = self.clients.index(of: client) {

    self.clients.remove(at: index)

    client.tcpClient.close()

    }

    }

    // 2.将消息转发出去

    for c in self.clients {

    c.tcpClient.send(data: data)

    }

    如果没有正在运行 也移除

    client.removeClientCallback = {[unowned self] (client) in

    if let index = self.clients.index(of: client) {

    self.clients.remove(at: index)

    client.tcpClient.close()

    }

    }

    +++++++++++++++++++++++++++++++++++++++++++++++++++

    import Cocoa

    class IMServerManager: NSObject {

    fileprivate lazy var tcpServer : TCPServer = TCPServer(addr: "0.0.0.0", port: 2828)

    fileprivate lazy var clients : [IMClient] = [IMClient]()

    }

    extension IMServerManager {

    func startRunning() {

    // 1.监听客户端的链接

    tcpServer.listen()

    // 2.接受客户端的链接

    DispatchQueue.global().async {

    while true {

    if let tcpClient = self.tcpServer.accept() {

    DispatchQueue.global().async {

    self.handleClient(tcpClient)

    }

    }

    }

    }

    }

    func stopRunning() {

    }

    }

    extension IMServerManager {

    fileprivate func handleClient(_ client : TCPClient) {

    let client = IMClient(client: client)

    clients.append(client)

    client.callback = {[unowned self] (isLeave, data, client) in

    // 1.是否需要移动客户端

    if isLeave {

    if let index = self.clients.index(of: client) {

    self.clients.remove(at: index)

    client.tcpClient.close()

    }

    }

    // 2.将消息转发出去

    for c in self.clients {

    c.tcpClient.send(data: data)

    }

    }

    client.removeClientCallback = {[unowned self] (client) in

    if let index = self.clients.index(of: client) {

    self.clients.remove(at: index)

    client.tcpClient.close()

    }

    }

    client.startReadMessage()

    }

    }

    +++++++++++

    import Cocoa

    class IMClient: NSObject {

    var tcpClient : TCPClient

    var callback : ((Bool, Data, IMClient) -> Void)?

    var removeClientCallback : ((IMClient) -> Void)?

    fileprivate var isRunning : Bool = false

    init(client : TCPClient) {

    self.tcpClient = client

    }

    }

    extension IMClient {

    func startReadMessage() {

    isRunning = true

    while isRunning {

    if let lengthByte = tcpClient.read(4) {

    // 1.获取数据的长度

    let lengthData = NSData(bytes: lengthByte, length: 4)

    var length : Int = 0

    lengthData.getBytes(&length, length: 4)

    // 2.读取消息的类型

    guard let typeBytes = tcpClient.read(2) else {

    tcpClient.read(length)

    continue

    }

    let typeData = NSData(bytes: typeBytes, length: 2)

    var type : Int = 0

    typeData.getBytes(&type, length: 2)

    print(type)

    // 3.获取具体的内容

    guard let dataBytes = tcpClient.read(length) else {

    return

    }

    let msgData = Data(bytes: dataBytes, count: length)

    // 1> 判断是否是离开消息: 告诉其他人, 有人离开房间, 将该客户端从数组中移除

    // 2> 其他消息, 直接转发给其他客户端

    let isLeave = type == 1 ? true : false

    callback?(isLeave, (lengthData as Data) + (typeData as Data) + msgData, self)

    } else {

    isRunning = false

    removeClientCallback?(self)

    }

    }

    相关文章

      网友评论

          本文标题:Socket

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