Post

소켓 게임 서버 개발- 멀티스레드 활용

소켓 게임 개발

자바를 사용한 멀티유저 소켓 게임 서버 개발 프로젝트에서 스레드를 활용한 경험에 대한 내용입니다.

프로젝트 개요

프로젝트 설명

이 프로젝트는 자바로 개발한 멀티플레이어 소켓 게임으로, 여러 클라이언트가 동시에 접속하고 상호작용할 수 있는 퀴즈 게임입니다. 주요 기능은 클라이언트 간의 실시간 소통과 퀴즈 진행입니다.

기술 스택

  • 자바 (Java)
  • 소켓 프로그래밍
  • 멀티스레딩

스레드 구현

서버는 다수의 클라이언트와 동시에 상호작용할 수 있어야 합니다. 이를 위해 각 클라이언트의 연결을 별도의 스레드에서 처리하였습니다.

서버 스레드 구조

서버는 클라이언트의 연결을 수신하기 위해 AcceptServer 스레드를 사용하고, 각 클라이언트의 요청을 처리하기 위해 UserService 스레드를 생성합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 새로운 참가자 accept() 하고 user thread를 새로 생성한다.
class AcceptServer extends Thread {
	@SuppressWarnings("unchecked")
	public void run() {
		while (true) { 
			// 사용자 접속을 계속해서 받기 위해 
		}
    }
}
// 클라이언트 요청을 처리하는 스레드
class UserService extends Thread {
		private Socket clientSocket;

    public UserService(Socket clientSocket) {
        this.clientSocket = clientSocket;
    }

    public void run() {
        // 클라이언트와의 상호작용 처리
    }
}

데이터 충돌 문제

여러 플레이어가 동시에 여러 방에 참가하거나 게임을 진행할 때 데이터 충돌 문제가 발생했습니다. 하나의 서버 파일에서 모든 것을 관리하는 방식으로 인해 중간에 플레이어가 들어오면 값이 변경되어 다른 플레이어에게 영향을 주는 상황이 발생했습니다.

문제 해결

문제를 해결하기 위해 각 플레이어별로 스레드를 생성하여 동시에 여러 방에 참가할 수 있도록 했습니다. 또한, 각 방의 상태를 독립적으로 관리하기 위해 Room 객체와 RoomManager 클래스를 도입했습니다.

Room 객체와 RoomManager 클래스

각 방의 상태를 효율적으로 관리하기 위해 Room 객체와 RoomManager 클래스를 만들었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Room {
    private String roomName;
    private Vector<UserService> users;

    public Room(String roomName) {
        this.roomName = roomName;
        this.users = new Vector<>();
    }

    public void addUser(UserService user) {
        users.add(user);
    }

    public void removeUser(UserService user) {
        users.remove(user);
    }
}

class RoomManager {
    private Map<String, Room> rooms;

    public RoomManager() {
        rooms = new HashMap<>();
    }

    public Room getRoom(String roomName) {
        return rooms.get(roomName);
    }

    public void createRoom(String roomName) {
        rooms.put(roomName, new Room(roomName));
    }
}
This post is licensed under CC BY 4.0 by the author.