// 패킷 전송 테스트 IEnumerator CoSendPacket() { while (true) { yield return(new WaitForSeconds(3f)); C_Chat chatPacket = new C_Chat(); chatPacket.chat = "Hello Unity!"; ArraySegment <byte> segment = chatPacket.Serialize(); _session.Send(segment); } }
public void SendForEach() { lock (_lock) { foreach (ServerSession s in _sessions) { C_Chat chatPacket = new C_Chat(); chatPacket.chat = $"Hello Server!"; ArraySegment <byte> segment = chatPacket.Write(); s.Send(segment); } } }
public void SendForEach() { lock (m_lock) { foreach (ServerSession session in m_sessions) { C_Chat chatPacket = new C_Chat(); chatPacket.chat = $"Hello Server!"; ArraySegment <byte> sg = chatPacket.Write(); session.Send(sg); } } }
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; } GameRoom room = clientSession.Room; room.Push(() => room.Broadcast(clientSession, chatPacket.chat)); }
public static void C_ChatHandler(PacketSession packetSession, IPacket packet) { C_Chat chatPacket = packet as C_Chat; ClientSession clientSession = packetSession as ClientSession; if (clientSession.Room == null) { return; } // * 수정된 부분 // 이제 Broadcast를 바로 실행하지 않고, 해야 할 작업으로 JobQueue에 넘겨준다. // clientSession의 Room이 메모리 해제되거나 변경될 수 있으니, clientSession.Room을 별도의 변수에 저장하여 참조 카운트를 유지한다. GameRoom room = clientSession.Room; room.Push(() => { room.Broadcast(clientSession, chatPacket.chat); }); }