패킷까지는 준비 OK
session도 어느정도 끝났기 떄문에
컨텐츠를 작업할 대략적인 준비는 끝났다!
그런데 이것을 그냥 딱 하고 넘겨주면 난해할것이다.
그래서 이것을 어떻게 구조를 짜가지고 게임이든 MMO든 어떻게 만들어야할지
아리쏭하다.
다른 게임서적을 보아도 거의 여기까지인데
그래서 여기서 부터 어떻게 진행을 해야할까?
그래서 지난번까지 한 것을 그림으로 보면
이런식인데
왼쪽이 클라이고 오른쪽이 식당 == 서버인데
결국 식당에 있는 대리인이 clientSession인데
이녀석이 계속 늘어날 것이다.
그래서 오늘은
에 대한 내용을 배울 것이다.
그래서 채팅서버를 만들면 조금 감이 오기 때문에 그부분부터 진행을 할 것이다.
그리고 이렇게 간단하게 구현을 했을 때의 문제점들을 해결할 것인데
파트중에 이게 핵심이다.
나중에 서버코어를 실행하다 보면 이런저런 크래쉬가 나는 상황이 발생 할 것이다.
그 이유는 우리가 꼼꼼하게 처리를 안해준 부분들이 있기 때문이다.
그래서
예외 처리를 좀 수정을 하고 가자.
그래서 Session에서
이렇게 최소한의 방어를 해주도록 하자.
그래서 소켓을 다루는 부분은 다 try catch로 해주도록 하자.
Session >
이렇게하고 밑으로가서 다시
이런식으로 예외처리를 해주자
나중에 문제가 생기면 그때 다시 가서 수정을 ㄱㄱ.
그리고
한번 깨끗하게 밀어 주는 작업을 여기서 하고
DisConnect를 할 때
여기서 한번 호출을 해주도록 하자.
그래서 이정도면 땜빵이 된거같고 이제부터 오늘 할거 ㄹㅇ 시작을 하도록 하자.
그래서 어쨋든
서버를 만들때 MMO서버든 FPS서버든
채팅부터 테스트하면서 만들어 보는것이 좋다.
=> 채팅을 만들 수 있으면 MMO도 똑같이 만들 수 있다.
그래서 채팅을 만들어 보면 나머지 부분도 감이 쉽게오기 때문에 이것부터 할 것이다.
그래서 PDL
을 이렇게 수정을 하는데
C_chat의 chat은 보내는 메세지이고
S_chat은 받은 메세지를 다른 클라들 한테 뿌려주기 위해서 playerId를 받고
해당 chat(메세지)를 뿌려주도록 하겠다.
그리고 배치파일 클릭을 한다.
그러면 갱신이 된다.
그다음 채팅을 구현해야하는데
일단 강제로 채팅방에 입장을 시켜주도록 하겠다.
Server > GameRoom만들고
이렇게 하고
GameRoom의 들어오고 나가는 부분은 RaceCondition이 발생할 수 있기 때문에
lock을 걸어주고 작업을 하야한다
항상 "멀티 쓰레드" 환경을 생각하면서
(그리고 멀티 쓰레드 환경에서는 List가 제대로 동작 안 할 수도있다)
Room도
이렇게 만들어 준다.
그리고
Main에서 이렇게
ClientSession을 new를 통해서 return을 하고있었는데
이런 작업을 중간에 SessionManager를 둬가지고
이녀석이 session들을 발급을 해주면 좋을 것이다.
그러면 어떤 세션을 발급했고 몇개를 발급했고 이런것을 관리가 하기 쉬워지니까
그래서 클라세션매니저를 Server || ServerCore둘중 아무데서나 관리를 해줘도된다.
그래서 우리는 이렇게
Server >
다시 싱글톤으로 구현을 해주도록 하자.
그러면 언제든지 SessionManager.Instance로 _session에 접근이 가능하다.
그리고
이렇게 Generate라는 클라세션을 뱉는 함수를 만들어 주도록 하자.
여기서 _sessions에다가 추가를 하고 만든 session을 뱉어주도록 하겠다.
그라고 혹시모르니까
만든 sessionId로 이렇게 Find, Remove도 구현을 해주도록 하자.
그리고 Session폴더 만들어서 이렇게 정리 ㄱㄱ
그리고 Server > Program ㄱㄱ
return 을 이렇게 하는게 아니라 이제
이렇게 해주게 되는 것이다.
그리고 생성하고나서 바로 제거는 어디서 할것이냐면은
ClientSession >
연결이 끊길때 나자신을 이제 연결 끊어줘! 라고 보내면된다.
그리고 이제 GameRoom에서 뭔가를 해주면되는데
우리가 지금 Program산하에다가 Room을 static으로 만들어 줬었는데
전역으로 하나만 존재를 하니까
이렇게 해주도록 하자.
그리고 연결끊겼을때 체크를 해주고 나가도록 하자.
이제 그리고 할것은
클라쪽에서 채팅 패킷을 보냈다고 가정을 하면은
그녀석은 PacketHandler쪽으로 올 것이다.
이제 그 부분을 처리를 해주면된다.
그래서 핸들러에서
이렇게 한다음에
채팅을 BroadCast를 통해 뿌려주면된다.
실제로도 이런 방식으로 자주 일어나게 될 것이다.
그래서 GameRoom에서
이렇게 인자를 받을 것인데
이녀석은 뭘 해야되냐? 하면은
내 방에 있는 모든 애들한테 다 접근을 해가지고
채팅메세지를 뿌리면된다.
그래서 id는 이렇게 chat은 이렇게 해주면된다.
그리고 써주는 부분은
이렇게 해준다 그리고
이제 sessions에 "접근"을 할 것이기때문에
"멀티쓰레드"라 무조건 락을 걸어주고 작업을 해야한다.
그래서 락을 걸고 이렇게 Send를 하면된다.
결국 BroadCast함수는
내방에 있는 모든 애들한테 == 밑줄 친 리스트
foreach로 하나씩 하나씩 순회를 하면서
s.Send(segment)로 채팅 메세지를 뿌려주는 상황이 된것이다.
이까지 했으면서 서버는 어느정도 된것이고
클라쪽에서도 생각을 해보도록 하자.