서버 공부

[서버 공부]미니 프로젝트 채팅 방 만들 5편

myjeongjun 2025. 2. 13. 20:56

이번편에서 한 점

1.4편에서 보완해야하는 점들 전부 개선

1)현재 방에 입장해있을시 다른방으로 입장시도하느걸 막기

 

"/나가기"를 입력하여 메인로비로 나간뒤에 나갈수있게 만들어놓음

 

2,3)거절 메시지 유형을 Enum으로 분류한다음에 유형에 따라 메시지 전송

->PacketHandler Class를 정의해서 어떤 패킷으로 응답할지를 미리 정의해놓음

 

PacketHandler 클래스의 일부

 internal class PacketHandler
 {
     public static void RejectRequest(ClientSession session,RejectType type)
     {
         Server_Packet packet = new Server_Packet();
         packet.playerid = session.sessionID;

         switch (type) 
         {
             case RejectType.Invalid:
                 packet.message = "여기선 수행할수 없는 동작입니다!";
                 break;
             case RejectType.FullRoom:
                 packet.message = "방이 꽉차서 입장에 실패했습니다!";
                 break;
             case RejectType.NotinMainLobby:
                 packet.message = "채팅방에서 다른 방으로 입장 할 수없습니다! 메인로비로 나가서 시도해주세요";
                 break;
             case RejectType.NotExist:
                 packet.message = "존재하지 않은 방 입니다!";
                 break;


         }
         ArraySegment<byte> segment = packet.GeneralWrite(PacketID.S_Chat);
         session.Send(segment);
         Console.WriteLine($"ID = {session.sessionID} 클라이언트에게 요청 거절 메세지 송신");
     }

2.채팅방에 누군가 있는 상태에서 다른 사람이 입장했을때 채팅방에 있는 사람들에게 누가 입장했는지를 BroadCast를 해줌

3.서버로부터 온 공지인지 다른 플레이어로 부터 온 메시지인지를 구분해서 출력

 

4.채팅방에서 나가기 기능 + 나갔을때 채팅방에 있는 플레이어들한테 알림

 

 

보안해야할점

이번편까지해서 구현해야할 사항들을 모두 구현한거 같다.

 

이제 고려해야할점은 Client가 매우 많아졌을때의 상황이다.

지금 상황에서 문제가 발생할수있는 부분은

1.채팅방에 입장시킬때 동시에 많은 클라이언트가 입장을 시도하면 멀티스레드에 대한 대비를 해놓지 않았기 때문에 오류가 나지않을까? -> 6명이 동시에 입장시도한다음 최대 인원이 5명이지만 6명이 들어가버리는 상황

 

2.지금 채팅을 보내는것도 한 두명이 보내서 그렇지 실제 채팅방은 여러명이 채팅을 마구 보낼것이기 때문에 패킷을 일일이 처리해준것보다 패킷을 모아서 보내는게 효율적 일 수도있다.

->일정 패킷이 모일때까지 보내지 않게 구현을 했다고 가정했을때, 채팅을 여려명이서 보내지 않고 한사람만 보낸다면 패킷이 모일때까지 기다려서 즉각적으로 사람들에게 채팅이 안 보내지지 않을까?(시간을 기반으로 패킷을 모아서 보내야 할거 같음)