Esempio n. 1
0
// 处理客户端连接
// 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)
	}
}
Esempio n. 2
0
// 清理过期的客户端
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)
	}
}