// 处理客户端连接 // conn:客户端连接对象 func handleConn(conn net.Conn) { // 创建客户端对象 clientObj := client.NewClient(conn) // 将客户端对象添加到客户端增加的channel中 clientBLL.RegisterClient(clientObj) // 将客户端对象添加到客户端移除的channel中 defer func() { playerBLL.DisconnectByClient(clientObj, disconnectType.FromRpc) }() // 无限循环,不断地读取数据,解析数据,处理数据 for { // 先读取数据,每次读取1024个字节 readBytes := make([]byte, 1024) // Read方法会阻塞,所以不用考虑异步的方式 n, err := conn.Read(readBytes) if err != nil { break } // 将读取到的数据追加到已获得的数据的末尾 clientObj.AppendContent(readBytes[:n]) // 处理数据 handleClientContent(clientObj) } }
// 清理过期的客户端 func clearExpiredClient() { for { // 休眠指定的时间(单位:秒)(放在此处是因为程序刚启动时并没有过期的客户端,所以先不用占用资源;并且此时LogPath尚未设置,如果直接执行后面的代码会出现panic异常) time.Sleep(configBLL.CheckExpireInterval() * time.Second) beforeClientCount := clientBLL.GetClientCount() beforePlayerCount := playerBLL.GetPlayerCount() // 获取过期的客户端列表 expiredClientList := clientBLL.GetExpiredClientList() expiredClientCount := len(expiredClientList) if expiredClientCount == 0 { continue } for _, item := range expiredClientList { playerBLL.DisconnectByClient(item, disconnectType.FromExpire) } // 记录日志 logUtil.Log(fmt.Sprintf("清理前的客户端数量为:%d,清理前的玩家数量为:%d, 本次清理不活跃的数量为:%d", beforeClientCount, beforePlayerCount, expiredClientCount), logUtil.Debug, true) } }