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;
}
}
세션을 새로 생성하는 함수이다.
생성한 함수는 리스트에 저장해둔다.
connector.Connect(endPoint, () => { return SessionManager.Instance.Generate(); }, 10);
Main에서 다음과 같은 방식으로 세션을 생성하여 연결한다.
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한다.
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를 보낸다.