반응형
간단한 채팅 서버 구현해보기
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는 한 쓰레드가 담당해서 하게 해야
- 나머지는 일감을 큐에 넣고 다른일 하러 가면 된다.
반응형
'C# > 네트워크' 카테고리의 다른 글
[Unity][서버] 서버 - Unity 연동 (2) (0) | 2024.06.23 |
---|---|
[c#][서버] Command 패턴 / JobQueue (0) | 2024.06.14 |
[c#][서버] PacketGenerator (3) (0) | 2024.06.12 |
[c#][서버] PacketGenerator(2) (0) | 2024.06.12 |
[c#][서버] Packet Generator - 코드 작성 자동화 (2) | 2024.06.09 |