Socket

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)