네트워크

[C#] 패킷 효율적으로 보내기

우대비 2022. 6. 21. 19:54
반응형

수백명이 채팅을 한다고 할때 패킷을 하나하나씩 보내면 답도 없음

그래서 밑에처럼 모아서 보내야함

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