<?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 으로 보내는 패킷이다.
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에 추가하고, 퇴장시 삭제한다.
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);
}
}
세션 자체를 삭제하는 함수이다.