반응형
수백명이 채팅을 한다고 할때 패킷을 하나하나씩 보내면 답도 없음
그래서 밑에처럼 모아서 보내야함
class GameRoom : IJobQueue
{
List<ClientSession> _sessions = new List<ClientSession>();
JobQueue _jobQueue = new JobQueue();
List<ArraySegment<byte>> _pendingList = new List<ArraySegment<byte>>();
ArraySegment를 List에 담아서 한방에 보낼거
public void Push(Action job)
{
_jobQueue.Push(job);
}
public void Flush()
{
foreach (ClientSession s in _sessions)
s.Send(_pendingList);
Console.WriteLine($"Flushed {_pendingList.Count} items");
_pendingList.Clear();
}
클라이언트에 __pendingList를 보냄
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();
// 패킷 모아보내기
_pendingList.Add(segment);
}
ArraySegment가 만들어지면 바로 보내지 않고 _pendingList에 저장
public void Send(List<ArraySegment<byte>> sendBuffList)
{
if (sendBuffList.Count == 0)
return;
lock (_lock)
{
foreach (ArraySegment<byte> sendBuff in sendBuffList)
_sendQueue.Enqueue(sendBuff);
if (_pendingList.Count == 0)
RegisterSend();
}
}
List를 하나하나 추출해서 전송
// Main
while (true)
{
Room.Push(() => Room.Flush());
Thread.Sleep(250);
}
Flush()가 실행이 되는데 0.25초 간격으로 실행
반응형
LIST
'네트워크' 카테고리의 다른 글
Google Protocol Buffers 설치 (0) | 2022.07.19 |
---|---|
[C#] TaskTimer (0) | 2022.06.21 |
[C#] JobQueue (0) | 2022.06.20 |