Go Version : 1.21.5 2024 컴퓨터공학과 캡스톤디자인 - Next Reality
이전 내용 : 2024-05-30-GoLang으로 UDP 서버 만들기 (3)
이전의 5월 이후에는 대부분 작은 버그 수정 or 프린트 줄이기 정도였다가 캡스톤디자인 2 과목 들어오면서 주요 과제로 데이터 P2P 통신이 추가됨
P2P 구현 시도 (1)
우리가 예상한 시나리오
- 클라이언트 (1) → 서버 : PlayerJoin 보냄
- 서버 → 클라이언트 (1) : PlayerJoin 브로드캐스트
- 클라이언트 (1) → 서버 : 맵 데이터 다운 후 MapReady 보냄
- 서버 → 클라이언트 (1) : MapReady 된 플레이어 목록에 클라이언트 (1)을 저장
- 클라이언트 (2) → 서버 : PlayerJoin 보냄
- 서버 → 클라이언트 (2) : MapReady 된 플레이어는 오브젝트 데이터를 다 가지고 있다는 것이 확인되었으므로, 클라이언트 (1)의 주소를 포함해서 클라이언트 (2)에게 돌려줌
- 클라이언트 (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
}