UnityServer - 채팅 (2)

k_hyun·2022년 11월 11일
0

Unity_Server

목록 보기
32/32

SessionManager.cs (DummyClient)

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

        List<ServerSession> _sessions = new List<ServerSession>();
        object _lock = new object();

        public void SendForEach()
        {
            lock (_lock)
            {
                foreach (ServerSession session in _sessions)
                {
                    C_Chat chatPacket = new C_Chat();
                    chatPacket.chat = $"Hello Server !";
                    ArraySegment<byte> segment = chatPacket.Write();

                    session.Send(segment);
                }
            }
        }

리스트에 있는 각 세션에 패킷의 내용을 보내는 기능을 한다.

        public ServerSession Generate()
        {
            lock (_lock)
            {
                ServerSession session = new ServerSession();
                _sessions.Add(session);
                return session;
            }
        }   

세션을 새로 생성하는 함수이다.

생성한 함수는 리스트에 저장해둔다.

Program.cs (DummyClient)

connector.Connect(endPoint, () => { return SessionManager.Instance.Generate(); }, 10);

Main에서 다음과 같은 방식으로 세션을 생성하여 연결한다.

PacketHandler.cs (Server)

class PacketHandler
{
    public static void C_ChatHandler(PacketSession session, IPacket packet)
    {
        C_Chat chatPacket = packet as C_Chat;
        ClientSession clientSession = session as ClientSession;

        if (clientSession.Room == null)
            return;

        clientSession.Room.Broadcast(clientSession, chatPacket.chat);
    }    
}

클라이언트로부터 온 패킷을 Broadcast한다.

GameRoom.cs

		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);
            }
        }

클라에서 서버로 패킷의 playerId를 보낸다.

실행 결과

0개의 댓글