C#/네트워크

[c#][서버] 채팅 테스트

goliot 2024. 6. 14. 03:17
반응형

간단한 채팅 서버 구현해보기

namespace Server
{
    class GameRoom
    {
        List<ClientSession> _sessions = new List<ClientSession>();
        object _lock = new object();

        public void Broadcast(ClientSession session, string chat)
        {
            S_Chat packet = new S_Chat();
            packet.playerId = session.SessionId;
            packet.chat = $"{chat} I am {packet.playerId}";
            ArraySegment<byte> segment = packet.Write();

            lock(_lock)
            {
                foreach (ClientSession s in _sessions)
                    s.Send(segment);
            }
        }

        public void Enter(ClientSession session)
        {
            lock (_lock)
            {
                _sessions.Add(session);
                session.Room = this;
            }
        }

        public void Leave(ClientSession session) 
        {
            lock (_lock)
            {
                _sessions.Remove(session);
            }
        }
    }
}
  • 방 하나를 만들고, 패킷이 전송되면, 그 방에 모두에게 뿌릴 수 있는 Broadcast 작성
  • 이 부분이 시간복잡도가 가장 높은, 성능에 치명적인 요소
  • Broadcast의 lock에 브레이크를 걸어보면 대부분의 쓰레드가 여기에서 락을 기다리고있음
    • 그러면 쓰레드가 돌아오지 않으니, 새로운 쓰레드가 계속 새로 생김
    • 주방에 직원이 1명밖에 못들어가는 공간인데, 직원이 100명인 것
  • 무조건 락을 잡아서 실행하는 것이 아니라, 저 Broadcast는 한 쓰레드가 담당해서 하게 해야 
    • 나머지는 일감을 큐에 넣고 다른일 하러 가면 된다.
반응형