Go Version : 1.21.5 2024 컴퓨터공학과 캡스톤디자인 - Next Reality

이전 내용 : 2024-05-30-GoLang으로 UDP 서버 만들기 (3)

이전의 5월 이후에는 대부분 작은 버그 수정 or 프린트 줄이기 정도였다가 캡스톤디자인 2 과목 들어오면서 주요 과제로 데이터 P2P 통신이 추가됨

P2P 구현 시도 (1)

우리가 예상한 시나리오

  1. 클라이언트 (1) 서버 : PlayerJoin 보냄
  2. 서버 클라이언트 (1) : PlayerJoin 브로드캐스트
  3. 클라이언트 (1) 서버 : 맵 데이터 다운 후 MapReady 보냄
  4. 서버 클라이언트 (1) : MapReady 된 플레이어 목록에 클라이언트 (1)을 저장
  5. 클라이언트 (2) 서버 : PlayerJoin 보냄
  6. 서버 클라이언트 (2) : MapReady 된 플레이어는 오브젝트 데이터를 다 가지고 있다는 것이 확인되었으므로, 클라이언트 (1)의 주소를 포함해서 클라이언트 (2)에게 돌려줌
  7. 클라이언트 (2) 클라이언트 (1) : 오브젝트 데이터를 다운받음

따라서, 서버는 MapReady 된 플레이어 목록을 가지고 있어야 함 또한 MapReady 된 플레이어 중에 한 명을 선택하고자 함

func FindLoadedPlayer(mapid string, result chan string) {
	// mapid 맵 내에 있는 플레이어 중에서 맵 로딩이 모두 완료된 플레이어의 아이디를 랜덤으로 골라 Return
 
	var selectedNumber []int
 
	for {
		randomNumber := rand.Intn(len(MapidUserList[mapid]))
		for !contains(selectedNumber, randomNumber) {
			randomNumber = rand.Intn(len(MapidUserList[mapid]))
		}
 
		randomUser := MapidUserList[mapid][randomNumber]
		loaded, exists := UserLoaded[randomUser]
		if exists && loaded {
			result <- randomUser
		} else {
			selectedNumber = append(selectedNumber, randomNumber)
			if len(selectedNumber) == len(MapidUserList[mapid]) {
				selectedNumber = []int{}
				time.Sleep(1 * time.Second)
			}
			continue
		}
	}
}
 
// 슬라이스에 값이 있는지 확인하는 함수
func contains(slice []int, value int) bool {
	for _, v := range slice {
		if v == value {
			return true
		}
	}
	return false
}

P2P 구현 시도 (2)

데이터를 한 명 한테만 받아오는게 아니고 여러명한테 분할로 받을 수도 있기 때문에, 맵 로딩이 완료된 모든 플레이어의 ID를 반환하게 변경함

func FindLoadedUser(mapid string) []string {
	// mapid 맵 내에 있는 플레이어 중에서 맵 로딩이 모두 완료된 플레이어의 아이디를 랜덤으로 골라 Return
	// 241107 변경사항 : 맵 로딩이 완료된 모든 플레이어의 ID를 return
	// 다섯 번 검사하는 동안 아무도 로딩이 안되면 그냥 nil
 
	fmt.Printf("Find Loaded Player Start\n")
 
	howMuchUsers := 1
	epoch := 0
 
	loadedUsers := MapidLoadedList[mapid]
 
	selectedUsers := []string{}
 
	for epoch < howMuchUsers {
		fmt.Printf("Epoch %d\n", epoch+1)
		fmt.Printf("Loaded Users : %s\n", loadedUsers)
 
		firstLoadedUsers := loadedUsers[0]
		selectedUsers = append(selectedUsers, firstLoadedUsers)
		loadedUsers = append(loadedUsers[1:], firstLoadedUsers)
 
		epoch += 1
	}
 
	MapidLoadedList[mapid] = loadedUsers
 
	for index, userid := range selectedUsers {
		selectedUsers[index] = UserAddr[userid]
	}
 
	fmt.Printf("Mapid Loaded List : %s\n", MapidLoadedList[mapid])
 
	fmt.Printf("Selected Users : %s\n", selectedUsers)
 
	return selectedUsers
 
}