UnityServer - 채팅 (1)

k_hyun·2022년 11월 10일
0

Unity_Server

목록 보기
31/32

PDL.xml

<?xml version="1.0" encoding="utf-8" ?>
<PDL>
	<packet name="C_Chat">
		<string name="chat"/>
	</packet>
	<packet name ="S_Chat">
		<int name ="playerId"/>
		<string name="chat"/>
	</packet>
</PDL>

채팅 시스템을 테스트 해보기 위해 패킷 이름을 Chat으로 설정하였다.

C_는 Client -> Server

S_는 Server -> Client 으로 보내는 패킷이다.

GameRoom.cs

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;
            ArraySegment<byte> segment = packet.Write();

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

Broadcast 함수는 해당 방에 입장하여 패킷을 전송하는 기능을 한다.

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

        public void Leave(ClientSession session)
        {
            lock (_lock)
            {
            _sessions.Remove(session);
            }
        }
    }
}

GameRoom에 해당 세션들이 입장 또는 퇴장할 때 사용하는 함수들이다.

입장시 SessionList에 추가하고, 퇴장시 삭제한다.

SessionManager.cs

namespace Server
{
    internal class SessionManager
    {
        static SessionManager _session = new SessionManager();
        public static SessionManager Instance { get { return _session; } }

        int _sessionId = 0;
        Dictionary<int ,ClientSession> _sessions = new Dictionary<int ,ClientSession>();
        object _lock = new object();

        public ClientSession Generate()
        {
            lock (_lock)
            {
                int sessionId = ++_sessionId;

                ClientSession session = new ClientSession();
                session.SessionId = sessionId;
                _sessions.Add(sessionId, session);

                Console.WriteLine($"Connected : {sessionId}");

                return session;
            } 
        }

세션들을 생성 및 관리하기 위한 매니저이다.

Generate는 말 그대로 새로운 ClientSession을 생성하는 함수이다.

생성된 세션의 id와 세션 객체를 딕셔너리에 담아서 관리한다.

        public ClientSession Find(int id)
        {
            lock (_lock)
            {
                ClientSession session = null;
                _sessions.TryGetValue(id, out session);
                return session;
            }
        }

세션 id를 통해 세션 객체를 찾는 함수이다.

        public void Remove(ClientSession session)
        {
            lock (_lock)
            {
                _sessions.Remove(session.SessionId); 
            }
        }    

세션 자체를 삭제하는 함수이다.

0개의 댓글